【问题标题】:How to write XPath to text before some text?如何在某些文本之前将 XPath 写入文本?
【发布时间】:2020-11-10 15:47:18
【问题描述】:

我正在为我的 selenium 项目使用临时电子邮件,但我已经被这个问题困扰了一段时间。信息似乎总是在变化,我无法弄清楚我应该如何编写它。这是 HTML:

<a href="https://temp-mail.org/en/view/cd89ea25d93a2fed0d182d9d8225b5b" title="" class="viewLink title-subject" data-mail-id="cd89ea25d93a2fed0d182d9d82425b5b">812479 is your Instagram code</a>

我尝试使用我读过的各种方法来查找邮件 ID。

execute = browser.find_element_by_xpath('.//span[@class = "data-mail-id"]') #Attempt 1
execute = browser.find_element_by_xpath('//span[text()="Instagram"]')

我什至复制了完整的 xpath,但它总是返回 Unable to Locate Element 但是,每次您向收件箱发送电子邮件时,data-mail-id 和代码都会更改。我需要改变什么?

我想要后面跟" is your Instagram code" 的字符串 ("812479")。

【问题讨论】:

  • 唯一改变的是id和代码
  • 请注意,类不是data-mail-id,而是viewLink title-subject,text() 不是Instagram,而是812479 is your Instagram code。也许你需要contains()
  • 那会是像//*[contains(text(), "is your Instagram code")]这样的东西吗?
  • 如果我找到了问题的最佳答案怎么办?
  • 如果它与收到的答案有很大不同,那么您应该发布并接受它。如果它与发布的答案之一基本相似,则接受发布的答案并可选择评论您如何调整它以满足您的需求。我们的目标是帮助未来的读者,同时通过接受和支持来表彰那些帮助过你的人,因为你觉得反映了贡献和乐于助人。

标签: python html xml selenium xpath


【解决方案1】:

直通 XPath 1.0

这个 XPath 表达式,

substring-before(//a[contains(.,' is your Instagram code')][1], 
                 ' is your Instagram code')

将返回包含该字符串的第一个a 元素中' is your Instagram code' 之前的子字符串,如果不存在此类元素,则返回空字符串。


Selenium 中的 XPath

您可以通过 Selenium 中的 XPath 选择 a 元素,

a = browser.find_element_by_xpath("//a[contains(.,' is your Instagram code')][1]")

然后access the element's text 通过a.textuse split() to implement substring-before()(链接显示之后,但技术很容易适应之前)。

【讨论】:

  • 请原谅我的无知,因为我并没有真正使用 selenium,但这是您所说的格式吗? browser.find_element_by_xpath("//a[contains(.,' is your Instagram code')][1], ' is your Instagram code'")
  • 答案已更新以解决 Selenium 后续评论。
  • 我觉得我做错了什么?当我收到确认电子邮件时,我 sleep(60) 只是为了确保元素已完全加载。然后我运行 a = browser.find_element_by_xpath("//a[contains(.,' is your Instagram code')][1]") 但它仍然说元素无法定位
  • 降低 XPath 的复杂性,直到您证明某些东西在工作。例如,看看您是否可以通过//a 获得任何a。然后添加回简单的过滤器,直到你构建出可以工作的代码。
【解决方案2】:

我非常喜欢使用 expected_conditions 来避免页面加载和脚本执行之间的时间问题。

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

myec = EC.visibility_of_element_located(
    (By.XPATH, '//a[contains(text(), "is your Instagram code")]'))

# search for the element on the page until found or TimeoutException is raised
wait = WebDriverWait(driver, timeout)
myelement = wait.until(myec, "Could not find Instagram Code") 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-18
    • 2019-10-01
    • 1970-01-01
    • 2021-11-29
    • 1970-01-01
    • 2012-07-25
    • 1970-01-01
    • 2015-06-22
    相关资源
    最近更新 更多