如何使用 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
【问题讨论】:
它在<iframe>
里面,你需要先切换到它。
【参考方案1】:
图表和相关的元素都在<iframe>
中,所以你必须:
您可以使用以下任一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 > iframe'
作为 CSS SELECTOR?
@MosheSlavin 从通用方法来看,直接搜索iframe
标签会快得多。不过'#chartholder > 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)
您可以像这样使用WebDriverWait
和EC
:
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,为什么还要使用XPath
和 contains()
?以上是关于如何使用 selenium webdriver 单击此按钮?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Java 在 selenium webdriver 中打开新选项卡,或者如何使用 selenium webdriver 使用动作类在 selenium 中按 ctrl + T [重复]
如何使用selenium webdriver来判断一个网页加载完毕
Selenium & webdriver.io 如何使用 executeScript?
如何使用selenium webdriver来判断一个网页加载完毕