Как нажать на элемент согласно HTML, предоставленному через Selenium? - PullRequest
0 голосов
/ 06 июля 2018

У меня есть ссылка, по которой мне нужно нажать:

<a id="selectLink">...</a>

Я делаю это так:

WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.ID, "selectLink")))

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

while True:
    try:
        WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.ID, "selectLink"))).click()
    except Exception:
        break

Я не могу сказать, в чем проблема.

Например:

while True:
    try:
        WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.ID, "selectLink"))).click()
        print(len(browser.find_elements_by_id("selectLink")))
        print('click')
    except Exception:
        print(len(browser.find_elements_by_id("selectLink")))
        print('break')
        break

Это дает мне:

1 
click
1 
click
1
break

И все же ничего не происходит. Мой вопрос: как получается, что цикл прерывается, даже если ссылка все еще доступна, поскольку длина по-прежнему равна 1?

Ответы [ 3 ]

0 голосов
/ 06 июля 2018

Я думаю, вы были довольно близки. Давайте посмотрим, что пошло не так.

  • В соответствии с пробной версией вашего кода:

    WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.ID, "selectLink")))
    

В этой попытке вы рассмотрели атрибут ID элемента, где в качестве элемента используется тег <a>. Как правило, когда вам нужно взаимодействовать с тегом <a>, всегда лучше воспользоваться помощью linkText , присутствующего в теге <a>.

  • Согласно вашему коду второй пробный код:

    WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.ID, "aaaa.Isu_Recherche_de_prmAvanceView.Button_Selectionner"))).click()
    

В этой попытке рассматриваемый вами атрибут ID не соответствует ID элемента согласно HTML.

Следовательно, вы видите ошибки.

Решение

В соответствии с HTML, которым вы поделились, чтобы щелкнуть по нужному элементу, вам нужно заставить WebDriverWait для элемента быть активируемым и использовать любое из решений:

  • LINK_TEXT

    WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.LINK_TEXT, "Sélectionner"))).click()
    
  • PARTIAL_LINK_TEXT

    WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.PARTIAL_LINK_TEXT, "Sélectionner"))).click()
    
  • CSS_SELECTOR

    WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.urBtnCntTxt"))).click()
    
  • XPATH:

    WebDriverWait(browser, timeout).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='urBtnCntTxt'][contains(.,'Sélectionner')]"))).click()
    

Примечание :

  • Вы должны добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • При использовании CSS_SELECTOR или XPATH всегда лучше создать их с помощью минимум двух атрибутов из class , id или другие

0 голосов
/ 09 июля 2018

Если бы я догадался, это может быть проблема времени. Если вы нажмете на ссылку, ссылка все еще существует на странице, так как локатор тот же. Если вместо этого щелкнуть ссылку, подождите, пока элемент не устареет (что означает, что страница перезагружается), затем подождите, пока он станет кликабельным (что означает, что страница завершилась перезагрузка), затем щелкните по нему еще раз ... этот цикл может работать .

wait = WebDriverWait(browser, timeout)
while driver.find_elements_by_id("selectLink")
    link = wait.until(EC.element_to_be_clickable((By.ID, "selectLink")))
    link.click()
    wait.until(EC.staleness_of(link))
0 голосов
/ 06 июля 2018

Вы можете попробовать что-то вроде этого:

button = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "text between anchor tags")))
button.click()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...