【问题标题】:How to write appropriate Xpath to locate text value如何编写适当的 Xpath 来定位文本值
【发布时间】:2021-05-18 21:30:23
【问题描述】:

我正在尝试使用 python、selenium 和 xpath 来获取以下 HTML 块中的文本 $0.180,

<div class="wlp-values-div">
  <span class="wlp-last-price-span">$0.180</span>

这段代码深入到网站的 HTML 中,我尝试使用以下 Xpath 来定位它:

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.get("https://smallcaps.com.au/stocks/?symbol=AWJ")
time.sleep(3)
webdriver.ActionChains(driver).send_keys(Keys.ESCAPE).perform()

ele = driver.find_element_by_xpath("//div[@class='wlp-values-div']/span[@class='wlp-last-price-span']")

但我收到错误:

NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//div[@class='wlp-values-div']/span[@class='wlp-last-price-span']"}

任何帮助将不胜感激

【问题讨论】:

  • 可能问题是元素在框架中。
  • 我没有,我不知道该怎么做并用 xpath 格式化它

标签: python selenium-webdriver xpath iframe css-selectors


【解决方案1】:

last price 字段位于嵌套的 &lt;iframe&gt; 元素中,因此您必须:

  • 诱导WebDriverWait 使 框架可用并切换到它

  • 诱导 WebDriverWait 使 child 框架可用并切换到它

  • 诱导WebDriverWait 使所需的元素可见

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

    • 使用CSS_SELECTOR

      driver.get('https://smallcaps.com.au/stocks/?symbol=AWJ')
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "svg[data-name='close']"))).click()
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe#wl-summary")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe.wl-quote-frame")))
      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "span.wlp-last-price-span"))).get_attribute("innerHTML"))
      driver.quit()
      
    • 使用XPATH

      driver.get('https://smallcaps.com.au/stocks/?symbol=AWJ')
      WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[name()='svg' and @data-name='close']"))).click()
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@id='wl-summary']")))
      WebDriverWait(driver, 20).until(EC.frame_to_be_available_and_switch_to_it((By.XPATH,"//iframe[@class='wl-quote-frame']")))
      print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[@class='wlp-last-price-span']"))).get_attribute("innerHTML"))
      driver.quit()
      
  • 注意:您必须添加以下导入:

     from selenium.webdriver.support.ui import WebDriverWait
     from selenium.webdriver.common.by import By
     from selenium.webdriver.support import expected_conditions as EC
    
  • 控制台输出:

      $0.190
    

您可以在How To sign in to Applemusic With Python Using Chrome Driver With Selenium找到详细的相关讨论


参考

您可以在以下位置找到一些相关讨论:

【讨论】:

  • 哇,这太清晰了!我刚刚有机会读到这篇文章,非常感谢你!您可以将复杂的主题分解成如此简单的术语的方式是对您自己的能力和知识的功劳
  • @lachlan 很高兴能为您提供帮助。请accept answer 点击我的 answer 旁边的空心刻度线,它就在 votedown 箭头下方,这样刻度线就会转动绿色.
【解决方案2】:
<iframe class="wl-summary" id="wl-summary" src="https://cloud.weblink.com.au/clients/smallcaps/summary/summary.aspx?symbol=AWJ&amp;" width="100%" height="25" frameborder="0" scrolling="no" allowtransparency="true" style="height: 1077px;"></iframe>
<iframe class="wl-quote-frame" src="quoteFrame.aspx?symbol=AWJ&amp;" scrolling="no" frameborder="0" height="1" style="height: 177px;"></iframe>

它位于双嵌套 iframe 中,因此您必须切换到它。这也有适当的等待,而不是使用 time.sleep() 并希望元素加载。它还会单击弹出窗口以避开并打印跨度文本。

wait = WebDriverWait(driver, 10)
driver.get("https://smallcaps.com.au/stocks/?symbol=AWJ")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '#tve_editor > div'))).click()
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, 'wl-summary')))
wait.until(EC.frame_to_be_available_and_switch_to_it((By.CLASS_NAME, 'wl-quote-frame')))
elem=wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'span.wlp-last-price-span')))
print(elem.text)

导入

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

【讨论】:

  • 在尝试使用您的代码时出现以下语法错误 SyntaxError: invalid syntax
猜你喜欢
  • 1970-01-01
  • 2019-06-16
  • 1970-01-01
  • 2022-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
相关资源
最近更新 更多