【发布时间】: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 字符串的“.//”开头。
对此有何建议?
【问题讨论】:
-
waitdocumentation 包含一个示例,该示例似乎使用父元素来查找其子元素,而不是从页面根目录进行搜索。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