【问题标题】:How to click on a element as per the HTML provided through Selenium?如何根据 Selenium 提供的 HTML 单击元素?
【发布时间】:2018-07-06 09:29:14
【问题描述】:

我有一个链接需要点击:

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

【问题讨论】:

  • 检查print(len(browser.find_elements_by_id("selectLink")))是否返回1
  • 我在 try 和 print('break') 中添加了 print('click') 和长度,在期望中添加了它给我的长度:click 1 break 1
  • 所以即使它找到了它断开的链接
  • 您可以在except块中再次点击该元素,以便selenium在发生异常时再尝试一次。然后你可以打破循环。参考 - stackoverflow.com/a/51017297/7352883
  • ...,你能分享一下这些...点里面的内容吗,我的意思是文字

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


【解决方案1】:

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

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

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

在此尝试中,您考虑了元素的ID 属性,其中元素是&lt;a&gt; 标记。作为一般做法,当您需要与 &lt;a&gt; 标签交互时,最好借助 &lt;a&gt; 标签中的 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 以使 元素可点击,并且可以使用以下任一解决方案:

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

【讨论】:

  • 对不起,我原来的帖子确实写错了,我做的两次试验的ID都是一样的。我也尝试了其他建议,并且喜欢我的试用,有时它会起作用,有时它不起作用..
  • 这就是我实际尝试的,就像我最初的尝试一样,有时它会成功点击,有时却没有
  • 试试我更新的答案,让我知道状态
  • 还是不行。我用解释更新了我的帖子
【解决方案2】:

你可以试试这样的:

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

【讨论】:

  • 不幸的是,我仍然遇到同样的问题,有时会点击有时却没有
  • 经常手动尝试会发生什么?它有时或一直有效。
  • 我会优先调查你的事情。
  • @Meryem : 你好,如果查询没有得到解决,那么你能提供&lt;a id="selectLink"&gt;...&lt;/a&gt;的完整HTML
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    相关资源
    最近更新 更多