Условный выбор элементов в веб-драйвере Selenium в Python - PullRequest
0 голосов
/ 13 марта 2020

Я сталкиваюсь с ситуацией, когда модал иногда имеет нужную кнопку для входа в Facebook, а иногда мне приходится нажимать «Дополнительные параметры», чтобы перейти к кнопке Facebook. Другое препятствие заключается в том, что xpath more_options_btn совпадает с xpath, называемым «Вход в систему?» поэтому я добавил [contains(text(),"More Options")], но не уверен в синтаксисе здесь и не могу найти правильный подход в документах. В любом случае это выдает ошибку, которая может быть вызвана тем, что элемент button не имеет текста, вместо этого он вложен следующим образом button > span > text

Пожалуйста, имейте в виду, что я хочу сделайте мое решение динамичным c и максимально надежным, но пока не имеете большого опыта работы с Selenium.

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())

driver.get('http://localhost:3000/')

try:
    fb_btn = driver.find_element_by_xpath(
        '//*[@id="modal-manager"]/div/div/div/div/div[3]/span/div[2]/button')
    fb_btn.click()
except:
    more_options_btn = driver.find_element_by_xpath(
        '//*[@id="modal-manager"]/div/div/div/div/div[3]/span/button[contains(text(),"More Options")]')
    more_options_btn.click()

    fb_btn = driver.find_element_by_xpath(
        '//*[@id="modal-manager"]/div/div/div/div/div[3]/span/div[2]/button')
    fb_btn.click()

Ответы [ 3 ]

0 голосов
/ 13 марта 2020

Вы можете использовать оператор ИЛИ в xpath |, чтобы сопоставить ваш xpath с несколькими условиями. Я бы порекомендовал использовать Relative xpath вместо Absolute 1.

Поскольку ваш xpath слишком длинный, он будет выглядеть так с условием ИЛИ

//*[@id="modal-manager"]/div/div/div/div/div[3]/span/div[2]/button | //*[@id="modal-manager"]/div/div/div/div/div[3]/span/button[contains(text(),"More Options")]
0 голосов
/ 14 марта 2020

С помощью комбинации из приведенного выше ввода мне удалось заставить его работать. Я избавился от большого количества длинных путей. Это имеет то преимущество, что мой код все равно будет работать, если порядок кнопок изменится. Однако он все равно сломается, если текст кнопок изменится, так что это компромисс. Вот результат:

from time import sleep

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())

driver.get('http://localhost:3000/')
sleep(5)

try:
    fb_btn = driver.find_element_by_xpath(
        "//*/button[contains(.,'Log in with Facebook')]").click()
except NoSuchElementException:

    more_options_btn = driver.find_element_by_xpath(
        "//*[contains(text(), 'More Options')]")
    more_options_btn.click()
    fb_btn = driver.find_element_by_xpath(
        '//*/button[contains(.,"Log in with Facebook")]')
    fb_btn.click()
0 голосов
/ 13 марта 2020

Попробуйте изменить xpath на:

//*[@id="modal-manager"]/div/div/div/div/div[3]/span/button[contains(.,"More Options")]

Он может найти дочерний узел, содержащий 'button' с текстом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...