【问题标题】:How to click this button using selenium webdriver?如何使用 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;里面,你需要先切换到它。

标签: python-3.x selenium xpath css-selectors webdriverwait


【解决方案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()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2020-01-24
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多