【问题标题】:Can't trigger a click on a certain link using selenium无法使用 selenium 触发对某个链接的点击
【发布时间】:2018-03-30 20:33:42
【问题描述】:

我已经用 selenium 在 python 中编写了一个脚本来单击网页中的某个链接以下载 excel 文件。但是,当我执行我的脚本时,它会抛出 timeout 异常。我怎样才能让它工作?任何帮助将不胜感激。

网站链接:webpage

我尝试过的脚本:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
driver.get('replace_with_above_link')

item = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".hasmore #dlink")))
item.click()
driver.quit()

包含下拉选项的 HTML 元素:

<li class="hasmore drophover"><span>Share &amp; more</span><div><ul><li><button class="tooltip" tip="Use a customizable report creator that can<br>output HTML, CSV, or a shareable link." id="share_on_ajax_result_table">Modify &amp; Share Table</button></li><li><button class="tooltip" tip="Get a bit of widget code to emed this table on your site">Embed this Table</button></li><li><button class="tooltip" tip="Convert the table below to comma-separated values<br>suitable for use with excel">Get as Excel Workbook (experimental)</button><a id="dlink" style="display: none;"></a></li><li><button class="tooltip" tip="Export table as <br>suitable for use with excel">Get table as CSV (for Excel)</button></li><li><button class="tooltip" tip="">Strip Mobile Formatting</button></li><li><a id="a_ajax_result_table" name="ajax_result_table" href="#ajax_result_table::none">Copy Link to Table to Clipboard</a></li><li><button class="tooltip" tip="">About Sharing Tools</button></li><li><button class="tooltip" tip=""><a href="https://www.youtube.com/watch?v=MWapXbaWs_U&amp;feature=youtu.be" target="_blank">Video: SR Sharing Tools &amp; How-to</a></button></li><li><button class="tooltip" tip=""><a href="https://www.youtube.com/watch?v=JkDLV0roT14&amp;feature=youtu.be" target="_blank">Video: Stats Table Tips &amp; Tricks</a></button></li></ul></div></li>

该文件在该网页中的位置(所需链接用铅笔标记):

【问题讨论】:

  • 您是否尝试过先将光标移到“Share&more”元素上?
  • 是的。我什至首先点击了share&amp;more 链接,发现它工作正常。当我尝试点击上面提到的链接时出现问题。
  • 链接实际上会导致文件下载和另存为对话框。为 Chrome 设置适当的自动下载选项(例如stackoverflow.com/questions/49053624/…
  • @SiKing,我查看了您的个人资料,看看您是否总是将以前提出的不同问题标记为重复?答案是不。当你看到你可以解决它们时,你会尝试解决它们。但是,请查看this link。那是你最新的回复。您认为链接的问题是独一无二的吗?您试图解决这个问题,因为它很容易,但是当您遇到任何像我在这里发布的帖子时,您将其标记为重复。开什么玩笑!!!!!!

标签: python python-3.x selenium selenium-webdriver web-scraping


【解决方案1】:

目标链接被隐藏,因此等待其可见性总是会失败。您应该尝试处理 button 节点:

item = wait.until(EC.visibility_of_element_located((By.XPATH, "//li[span='Share & more']")))
item.click()
wait.until(lambda driver: "drophover" in item.get_attribute("class"))
item.find_element_by_xpath("//button[.='Get as Excel Workbook (experimental)']").click()

【讨论】:

  • 我刚才试了一下。当遇到包含wait.until() 的行时,它会抛出超时异常。希望你看看。为此加一。谢谢先生。
  • 你的意思是item = wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".hasmore")))这一行吗?
  • 不,先生。此行wait.until(lambda driver: "drophover" in item.get_attribute("class")).
  • 是的。我的错误 :) 那是因为 ".hasmore" 选择器不可靠(请注意,有多个具有 "hasmore" 类名的节点)。尝试更新答案
  • 检查this ticket,如果没有帮助,请告诉我
【解决方案2】:

当您尝试单击文本为 Get as Excel Workbook (experimental) 的链接时,根据您的评论,您已经能够单击第一个中的 Share&more 链接放置并发现它工作在您预期的&lt;a&gt; 标记元素旁边包含设置为display: none; 的属性style。所以调用click()下载你可以使用下面的代码块:

Get_as_Excel_Workbook_link = driver.find_element_by_xpath("//li[@class='hasmore drophover']//ul//li//a[@id='dlink']")
driver.execute_script("arguments[0].removeAttribute('style')", Get_as_Excel_Workbook_link)
Get_as_Excel_Workbook_link.click()

更新 A

根据您的评论:

  • 我不确定您使用的xpath 是否有效

    "//li[a[@id='dlink']]/a"
    
  • 您尝试使用:

    Get_link = driver.find_element_by_xpath("//li[a[@id='dlink']]/a") 
    print(Get_link.get_attribute("outerHTML"))
    

但是为什么呢?有没有必要?

  • 根据我的研究和分析,您可以放心,您是在正确的地方。查看您分享的 HTMLformatted 版本以及我提供的 xpath 的分辨率。

<li class="hasmore drophover"><span>Share &amp; more</span>
  <div>
    <ul>
      <li><button class="tooltip" tip="Use a customizable report creator that can<br>output HTML, CSV, or a shareable link." id="share_on_ajax_result_table">Modify &amp; Share Table</button></li>
      <li><button class="tooltip" tip="Get a bit of widget code to emed this table on your site">Embed this Table</button></li>
      <li><button class="tooltip" tip="Convert the table below to comma-separated values<br>suitable for use with excel">Get as Excel Workbook (experimental)</button>
        <a id="dlink" style="display: none;"></a>
      </li>
      <li><button class="tooltip" tip="Export table as <br>suitable for use with excel">Get table as CSV (for Excel)</button></li>
      <li><button class="tooltip" tip="">Strip Mobile Formatting</button></li>
      <li><a id="a_ajax_result_table" name="ajax_result_table" href="#ajax_result_table::none">Copy Link to Table to Clipboard</a></li>
      <li><button class="tooltip" tip="">About Sharing Tools</button></li>
      <li><button class="tooltip" tip=""><a href="https://www.youtube.com/watch?v=MWapXbaWs_U&amp;feature=youtu.be" target="_blank">Video: SR Sharing Tools &amp; How-to</a></button></li>
      <li><button class="tooltip" tip=""><a href="https://www.youtube.com/watch?v=JkDLV0roT14&amp;feature=youtu.be" target="_blank">Video: Stats Table Tips &amp; Tricks</a></button></li>
    </ul>
  </div>
</li>
  • 所以你看到的结果是非常正确的。现在,为了您的理解,我在预期的标签中插入了一些文本作为 MyLink

    <a id="dlink" style="display: none;"></a>
    
  • 转换为:

    <a id="dlink" style="display: none;">MyLink</a>
    
  • 查看结果:

  • 再次查看我的解决方案,我可以确保它有效。

更新 B

unable to locate element 是调试的好消息,除了 "display: none;" 您已经通过提及 clicked 来解决实际问题首先在分享和更多链接上,发现它有效。当我尝试点击链接时出现问题

如果您观察到 HTML 元素在 class="tooltip" 内,因此您需要如下诱导服务员:

//perform click on the link Share&more
Get_as_Excel_Workbook_link = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//li[@class='hasmore drophover']//ul//li//a[@id='dlink']")))
driver.execute_script("arguments[0].removeAttribute('style')", Get_as_Excel_Workbook_link)
Get_as_Excel_Workbook_link.click()

【讨论】:

  • 非常感谢@DebanjanB 的解决方案。看起来很有希望。只要我靠近我的电脑,我就会让你知道反馈。
  • 我刚刚尝试过,但不幸的是它不能成功。具体来说,我也尝试使用Get_link = driver.find_element_by_xpath("//li[a[@id='dlink']]/a") print(Get_link.get_attribute("outerHTML")) 来查看我是否在正确的位置。它产生的结果是&lt;a id="dlink" style="display: none;"&gt;&lt;/a&gt;。原来没有这样的链接可以点击。
  • @Topto 查看我的答案更新并让我知道状态。
  • 我尝试了几次你建议的部分。每次它抛出unable to locate element 错误。但是,我也在 chrome 控制台中尝试了您的 xpath //li[@class='hasmore drophover']//ul//li//a[@id='dlink'] 以查看它是否能够找到所需的部分。但它不能。最后我在 chrome 中尝试使用这个 //li[contains(@class,'hasmore')]//ul//li//a[@id='dlink'] 并发现它找到了所需的部分。当我在脚本中尝试相同的操作时,我遇到了element not visible error。这是总状态。
  • 查看我的答案更新,让我知道状态。
猜你喜欢
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多