Ответы пользователя по тегу Selenium
  • Выдаёт ошибку NoSuchElementException( Selenium, Python )?

    Скорее всего проблема возникает из-за того, что вы не учитываете разрешение страницы, ваш локатор будет работать только на мобильной версии, когда ширина страницы в браузере менее 992 пикселей.
    Можете использовать этот локатор по XPath, он подойдет и для мобильной и для десктопной версии сайта
    //figure[@data-test-component='UserCell']//img
    Ответ написан
  • Почему браузер открывается, но не заходит на сайт?

    Попробуйте запускать Chrome с параметром --remote-allow-origins=*.

    Добавить в импорты
    import org.openqa.selenium.chrome.ChromeOptions;

    Заменить
    WebDriver driver = new ChromeDriver();
    На
    ChromeOptions options = new ChromeOptions();
    options.addArguments("--remote-allow-origins=*");
    WebDriver driver = new ChromeDriver(options);
    Ответ написан
    Комментировать
  • Как на сайте мосбиржи поменять месяц в календаре с помощью питона?

    Во-первых, это дубль вопроса.

    Во-вторых, там очень простые локаторы по XPath. На самом деле локаторы по XPath бывают довольно сложными, но это не ваш случай, тут достаточно прочитать любую вводную статью, чтобы разобраться в вопросе.

    локатор чтобы открыть календарь //input[contains(@class, "date-selector")]
    локатор для стрелочки влево //a[@data-handler="prev"]
    локатор для стрелочки вправо //a[@data-handler="next"]
    локатор для выбора года //select[@data-handler="selectYear"]
    локатор для выбора месяца //select[@data-handler="selectMonth"]
    локатор для выбора дня N //td[@data-handler="selectDay"]//a[text()="N"]

    Небольшая проблема может быть из-за того, что selenium не может нативно выбрать значение, используя select_by_visible_text и подобные методы, но и тут нечего сложного нет, отправляйте нажатия стрелочек с клавиатуры и выбирайте нужный вам месяц.

    Демонстрация
    from time import sleep
    
    from selenium import webdriver
    from selenium.webdriver import Keys
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    from webdriver_manager.chrome import ChromeDriverManager
    
    options = webdriver.ChromeOptions()
    options.add_argument('--disable-infobars')
    options.add_argument('--disable-extensions')
    options.add_argument('start-maximized')
    
    driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
    driver.get('https://www.moex.com/ru/bondization/calc')
    
    # Открываем календарь
    calendar = driver.find_element(By.XPATH, '//input[contains(@class, "date-selector")]')
    calendar.click()
    sleep(1)
    # Открываем выпадающий список
    calendar_month = driver.find_element(By.XPATH, '//select[@class="ui-datepicker-month"]')
    calendar_month.click()  # Начальное значение текущий месяц март
    sleep(1)
    calendar_month.send_keys(Keys.ARROW_UP)  # Февраль
    sleep(1)
    calendar_month.send_keys(Keys.ARROW_UP)  # Январь
    sleep(1)
    calendar_month.send_keys(Keys.ARROW_DOWN)  # Февраль
    sleep(1)
    calendar_month.send_keys(Keys.ARROW_DOWN)  # Март
    sleep(1)
    calendar_month.send_keys(Keys.ARROW_UP)  # Февраль
    sleep(1)
    calendar_month.send_keys(Keys.RETURN)  # Устанавливаем февраль
    sleep(5)
    driver.quit()
    Ответ написан
  • Python selenium как скачать конфиг?

    Можно использовать XPath для написания локатора, это очень мощный инструмент.
    locator= '//td[text()="user2"]//following-sibling::td//a[contains(text(),"Android")][1]'
    driver.find_element(By.XPATH, locator).click()


    Можно также воспользоваться ответом выше от duff89, только нужно учитывать, что на одной строке в таблице слово Andorid встречается дважды и вам нужен не i-й элемент, а 2 * i - 1, то есть первый, третий, пятый и т.д.
    Ответ написан
  • Как найти элемент по индексу в методе ожидания element_to_be_clickable?

    Тут есть сразу несколько вариантов, вот некоторые из них.
    Попробуйте использовать, подставляя нужное вам значение N, в первом и втором случае нумерация с единицы, в третьем с нуля.

    1. Использовать :nth-child() в CSS
    wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '[title="Связь"]:nth-child(N)')))

    2. Искать элемент через XPath
    wait.until(EC.element_to_be_clickable((By.XPATH, '//*[@title="Связь"][N]')))

    3. В метод element_to_be_clickable можно передавать не только локатор, но и сам элемент
    elements = driver.findElements(By.CSS_SELECTOR, '[title="Связь"]');
    wait.until(EC.element_to_be_clickable(elements[N]))


    UPD: Обновил второй способ, в первый раз забыл поставить звёздочку, звёздочка обозначает любой элемент, в место нее можно подставить свой элемент (div, span, li, td и т.д.) чтобы уточнить локатор.
    Ответ написан
  • Как заполнить форму python, selenium?

    Добрый день. У вас возникли проблемы потому что на сайте используется Shadow DOM.
    Скриншот фрагмента кода удалён модератором.

    Как работать с Shadow DOM в различных версиях Selenium можете прочитать например в этой статье на хабре.
    Если используйте актуальные версии, то ваш код может быть модифицирован таким образом
    from selenium import webdriver
    from fake_useragent import UserAgent
    from selenium.webdriver.chrome.service import Service
    from selenium.webdriver.common.by import By
    
    
    ua = UserAgent()
    url = "https://www.nealthy.com/alpha"
    
    options = webdriver.ChromeOptions()
    options.add_argument(f'user-agent={ua.chrome}')
    
    web_driver = Service('C:\\webdriver\\chromedriver.exe')  #ПУТЬ К ВЕБ ДРАЙВЕРУ
    driver = webdriver.Chrome(service=web_driver, options=options)
    
    driver.get(url=url)
    
    # Выше приведен ваш код, изменения начинаются здесь
    shadow_host = driver.find_element(By.XPATH, '//form-widget')
    shadow_root = shadow_host.shadow_root
    shadow_content = shadow_root.find_element(By.CSS_SELECTOR, '#firstname')
    shadow_content.send_keys('Mikhail')

    Еще обратите внимание, что в Shadow DOM лучше искать локатор по CSS селектору, иначе можно наткнуться на баги Selenium.
    Ответ написан
    1 комментарий
  • Почему не поднимается веб драйвер selenium после обновления хрома?

    Ваша проблема вероятнее всего связана с изменениями работы Headless mode в Google Chrome 110.
    Для того чтобы ваш скрипт продолжал работать, нужно внести небольшие изменения, в блоге разработчиков Selenium на эту тему была статья с примерами кода на разных языках.
    Ответ написан
    Комментировать
  • Почему Селениум не видит элемент?

    На сайте virustotal активно используется Shadow DOM.
    63dced61dfaa3597847544.png
    Чтобы обратиться к его содержимому в selenium нужно использовать метод shadow_root.
    Подробнее об этом вы можете почитать например в этой статье на Хабре https://habr.com/ru/company/simbirsoft/blog/598407/
    Ответ написан
    Комментировать
  • Как выбрать элемент если он совпадает со списком?

    Чтобы выбрать элемент списка вы должны найти тег select и использовать у него метод select_by_visible_text или select_by_value, если знаете искомое значение, все методы можно посмотреть в документации.

    Или же вы можете итерироваться по всем значениям списка, это ближе к вашей идее.
    В вашем случае должен получиться примерно следующий код
    correct_dubbing = ['TVShows', 'Кубик в Кубе (Kubik³) (реж. версия)', 'Дубляж']
    select = driver.find_elements(By.XPATH, '//*[@id="translators-list"]')
    for option in select.options:
        if option.text in correct_dubbing:
            option.click()
            break
    Ответ написан
    Комментировать
  • Как определить элемент TextInputbox с помощью selenium?

    Вы пытаетесь найти элемент учитывая его порядок на странице, этот способ имеет недостаток, если вдруг в будущем порядок элементов на странице поменяется, то локатор вернет неверный результат. Лучше воспользоваться тем, что input был обернут в div с классом qa-NameField, из названия можно предположить, что он был добавлен разработчиками по просьбе тестировщика, не пропадет и не изменится в случае дальнейшей доработки формы.

    Пример такого локатора выглядит как-то так
    //div[contains(@class, "qa-NameField")]//input
    Ответ написан