如何通过Selenium提供的HTML单击元素?

时间:2018-07-06 09:29:15

标签: python selenium selenium-webdriver xpath css-selectors

我有一个链接需要点击:

<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 :(得分:0)

您可以尝试以下方法:

button = WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.LINK_TEXT, "text between anchor tags")))
button.click()

答案 1 :(得分:0)

我认为您已经很接近了。让我们看看出了什么问题。

  • 根据您的代码优先代码试用版:

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

在这种尝试中,您考虑了元素的ID属性,其中元素是<a>标记。通常,当您需要与<a>标记进行交互时,最好利用<a>标记内的 linkText 来帮助您。

  • 根据您的代码第二次代码试用:

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

在这种尝试中,您认为的ID属性与HTML元素的ID不匹配。

因此您会看到错误。

解决方案

根据您共享的HTML来单击所需的元素,您需要诱导该元素使 WebDriverWait 成为可点击的,并且可以使用以下任一解决方案:< / p>

  • 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_SELECTORXPATH时,最好在 class id 或其他

答案 2 :(得分:0)

如果我猜到了,那可能是时间问题。如果单击该链接,则该链接仍然存在于页面上,因为定位符相同。如果您改为单击链接,请等待该元素过时(表明该页面正在重新加载),然后等待其可单击(指示该页面已完成重新加载),然后再次单击它...该循环可能会起作用

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))