【问题标题】:Selenium explicit wait with relative XPath locatorSelenium 显式等待与相对 XPath 定位器
【发布时间】:2017-10-26 20:18:39
【问题描述】:

在 Python 3.4 中使用 Selenium WebDriver。

我正在编写一个爬虫,并使用 XPaths 相对于某些非根祖先元素定位元素,如下所示:

ancestor_element = driver.find_element_by_xpath(ancestor_xpath)
child_element = ancestor_element.find_element_by_xpath(child_xpath)

这按预期工作。但是,我不确定如何通过显式等待调用来执行此相对位置,因为我看到的示例使用以下语法:

child_element =  WebDriverWait(driver,10).until(
    EC.presence_of_element_located((By.XPATH, child_xpath))
)

这似乎是根据页面根来评估 XPath,并抛出一个错误,抱怨 XPath 字符串的“.//”开头。

对此有何建议?

【问题讨论】:

  • wait documentation 包含一个示例,该示例似乎使用父元素来查找其子元素,而不是从页面根目录进行搜索。 element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id(“someId”))。我没有尝试过,但只知道它存在。您应该能够将查询更改为通过 xpath 搜索。
  • 为什么不立即组合 xpath 并搜索子元素?例如。如果祖先 xpath 是 //a/b 而子 xpath 是 .//c/d,那么它将与 //a/b//c/d 相同
  • 另一种选择是编写自定义等待条件:class child_is_present def __init__(self, ancestor_xpath, child_xpath)... def __call__(self, driver): ancestor_element = driver.find_element_by_xpath(*self.ancestor_xpath) child_element = ancestor_element.find_element_by_xpath(*self.child_xpath) if(child_element) return true
  • @RonNorris - lambda 解决方案正是我想要的,谢谢!
  • @KirilS。 - 组合 xpath 绝对是一个很好的解决方案,但是页面中有很多祖先元素的实例,我一次将它们传递给这个辅助方法。当我只想要其中一个祖先的孩子时,这意味着组合 xpath 将返回页面上每个祖先的孩子。 (例如,我只想要第 1 个人的名字,但我得到了页面上每个人的名字)。我可以将 [position()] 附加到父 XPath 来解决这个问题,但是 lambda 解决了。不管怎样,谢谢你们俩!我会投票,但似乎我的声誉仍然太低

标签: python python-3.x selenium xpath selenium-webdriver


【解决方案1】:

有同样的问题,请按照@Ron Norris 评论中的lambda 示例进行操作。但是,文档并不清楚如何找到相对于ancestor_elementchild_element,即使使用lambda

您实际上可以将 WebDriverWait 调用中的 driver 替换为您的 ancestor_element,以显式仅搜索 ancestor_element“下”的内容(即使文档字符串声明它必须是 @987654329 的实例@,我发现WebElement 也可以)。

所以我总结了类似的东西:

child_element =  WebDriverWait(ancestor_element,10).until(
    EC.presence_of_element_located((By.XPATH, child_xpath))
)

如果你想使用lambda,你可以这样做:

child_element =  WebDriverWait(ancestor_element,10).until(
    lambda x: x.find_element_by_xpath(child_xpath)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2011-05-19
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多