js后台无法点击下载link

Unable to click on the download link with js backend

网站上有一个 link 下载 csv 文件。 link 在 table 中,但实际下载 link 是隐藏的。

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

当上面的最后一行 运行 是脚本时 returns:

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

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

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

如何下载文件?

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

driver.find_element_by_link_text('ford.csv')

但是在这一点上值得一提的是字符.总是有一个特殊的effect/meaning.


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

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

    • 使用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
      

新版Selenium不支持PhantomJS,请考虑用户其他驱动。对于您的问题,使用 JS 单击 Button 时出现错误。

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

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