【问题标题】:Unable to click on the download link with js backendjs后端无法点击下载链接
【发布时间】:2019-11-11 20:51:29
【问题描述】:

网站上有一个下载 csv 文件的链接。该链接在表格中,但实际的下载链接是隐藏的。

<div id="testjs">
    <div test-example="">
        <table test-example="">
            <tr test-example="">
                <th test-example="">Car</th>
                <th test-example="">File</th>
            </tr>
            <tr test-example="">
                <td test-example="">Ford</td>
                <td test-example="">
                    <a test-example="" href="#">ford.csv</a>
                </td>
            </tr>
        </table>
    </div>
</div>

我正在尝试通过使用 python/selenium 抓取网站来自动下载文件。

from selenium import webdriver
driver = webdriver.PhantomJS()
driver.get("https://www.example.com")
driver.find_element_by_link_text('ford.csv')

当上面的最后一行运行时,脚本返回:

<selenium.webdriver.remote.webelement.WebElement (session="<example session string>", element="<example element string>")>

当我运行下面的代码时没有任何反应:

driver.find_element_by_link_text('ford.csv').click()

我如何获取要下载的文件?

【问题讨论】:

  • 使用 Chrome 无头浏览器而不是 PhantomJS
  • 您使用 chrome 遇到的问题有什么解决方案吗?
  • 我使用 chrome 驱动程序部分能够解决我的问题,但不是无头的。 DebanjanB 的解决方案确实有效。然而,有一个“允许 cookie”弹出,阻碍了我必须先点击的下载链接。无标题 chrome 的问题是没有下载任何内容。当 chrome 不是无头文件时,下载的文件。
  • 检查无头铬的这个答案看看是否有帮助stackoverflow.com/questions/58770745/…

标签: python selenium xpath css-selectors webdriverwait


【解决方案1】:

显然下面这行代码没有任何问题:

driver.find_element_by_link_text('ford.csv')

然而此时值得一提的是,dot 字符 . 总是具有特殊的效果/意义。


假设您打算在文本为 ford.csv 的元素上 click() 与文本为 Ford 的元素相邻,作为解决方案,您可以:

  • 将文本ford.csv 分成两部分fordcsv 并在 中使用
  • 当您打算调用 click() 时,您必须为 element_to_be_clickable() 诱导 WebDriverWait
  • 您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR:

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "tr[test-example] td:nth-child(2)>a[test-example]"))).click()
      
    • 使用XPATH:

      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(., 'ford') and contains(.,'csv')]"))).click()
      
    • 注意:您必须添加以下导入:

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

【讨论】:

【解决方案2】:

新的 Selenium 版本不支持 PhantomJS,请考虑用户其他驱动程序。对于您的问题,有一个错误单击带有 JS 的按钮。

试试这个,我在我的 selenium 库中找到了 click_js 按钮

item = driver.find_element_by_link_text('ford.csv')
ActionChains(driver).move_to_element(item).click().perform()

【讨论】:

  • 好的,我已经尝试将这种方法与无标题 chrome 一起使用,但没有任何反应。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 2011-01-25
  • 2015-05-30
  • 2015-10-13
相关资源
最近更新 更多