如何使用 selenium webdriver 单击此按钮?

Posted

技术标签:

【中文标题】如何使用 selenium webdriver 单击此按钮?【英文标题】:How to click this button using selenium webdriver? 【发布时间】:2019-12-14 19:57:59 【问题描述】:

我正在尝试从纳斯达克刮取数据表:https://www.nasdaq.com/symbol/msft/interactive-chart?timeframe=5d

我所做的是使用python和selenium webdriver点击表格按钮(在图表顶部,带有一个小表格标志)然后刮。

submit = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#dataTableBtn')))
submit.click()

但它不起作用。

此处为按钮 html

<div id="dataTableBtn" class="btn hideSmallIR stx-collapsible" onclick="dataTableLoader()"><span>Data Table</span></div>

EC 和通过

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

【问题讨论】:

它在&lt;iframe&gt;里面,你需要先切换到它。 【参考方案1】:

图表和相关的元素都在&lt;iframe&gt;中,所以你必须:

诱导 WebDriverWait 使所需的框架可用并切换到它。 诱导 WebDriverWait 使所需的元素可点击

您可以使用以下任一Locator Strategies:

使用CSS_SELECTOR

driver.get("https://www.nasdaq.com/symbol/msft/interactive-chart?timeframe=5d")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[src*='edgar-chartiq']")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.hideSmallIR#dataTableBtn>span"))).click()

使用XPATH

driver.get("https://www.nasdaq.com/symbol/msft/interactive-chart?timeframe=5d")
WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[contains(@src, 'edgar-chartiq')]")))
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//div[@class='btn hideSmallIR stx-collapsible' and @id='dataTableBtn']/span[text()='Data Table']"))).click()

注意:您必须添加以下导入:

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

浏览器快照:

这里可以找到Ways to deal with #document under iframe的相关讨论

【讨论】:

为什么不使用'#chartholder &gt; iframe' 作为 CSS SELECTOR? @MosheSlavin 从通用方法来看,直接搜索iframe 标签会快得多。不过'#chartholder &gt; iframe' 也可以。 是的,它有效!我是网络抓取的新手,所以我不熟悉 iframe。非常感谢您的帮助! @DebanjanB 您查找 IFRAME 与 MosheSlavin 的定位器的速度差异可以忽略不计。你在哪里,the search for a direct iframe tag will be much more faster【参考方案2】:

表格在iframe 中,所以只需切换到它!

frame = driver.find_element_by_css_selector('#chartholder > iframe')
driver.switch_to.frame(frame)

您可以像这样使用WebDriverWaitEC

frame = driver.find_element_by_css_selector('#chartholder > iframe')
wait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it(frame))

【讨论】:

【参考方案3】:

您要查找的按钮属于iframe,因此您必须先switch 才能找到该按钮。

iframe 和按钮都可以使用XPath contains() function 定位

driver.switch_to.frame(driver.find_element_by_xpath("//iframe[contains(@src,'edgar-chartiq')]"))

进入 iframe 后,您应该能够找到并点击按钮:

driver.find_element_by_xpath("//*[contains(text(),'Data Table')]").click()

【讨论】:

既然可以使用 CSS,为什么还要使用 XPathcontains()

以上是关于如何使用 selenium webdriver 单击此按钮?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]

如何使用selenium webdriver来判断一个网页加载完毕

Selenium & webdriver.io 如何使用 executeScript?

如何使用selenium webdriver来判断一个网页加载完毕

如何使用 C# 在 Selenium WebDriver (Selenium 2) 中最大化浏览器窗口?

如何在 ruby​​ 中使用 Selenium WebDriver (selenium 2.0) 客户端设置选项