我写了一个xpath,如下所示:
//div[contains(@id,'ext-element-')]/table[2]/tbody/tr/td/div/span
相同的xpath有时它会找到特定的元素。但有时它会抛出
ElementNotFoundException。
有没有方便的方法来解决这个问题?
答案 0 :(得分:1)
xPath中的元素越多(例如tbody/tr/td/div
),它破坏的可能性就越大(有时出于神秘的原因)。
尽可能使用descendant
跳过它们,例如:
//div[contains(@id,'ext-element-')]/table[2]/descendant::span[contains(@id, 'spanId')]
或者只是双斜杠//
(意思是任何子或子):
//div[contains(@id,'ext-element-')]/table[2]//span[contains(@id, 'spanId')]
更短,是的,但不太可读(容易错过斜线,然后想知道发生了什么)。但仍然大多喜欢双斜线。
使用"轴名称"可以使您的xPath更健壮。
以下是一些资源:
http://seleniumworks.blogspot.de/2014/03/xpath-selenium-uses-part-ii.html
https://www.simple-talk.com/dotnet/.net-framework/xpath,-css,-dom-and-selenium-the-rosetta-stone/
答案 1 :(得分:0)
此前的步骤是否会导致对DOM的更改(例如,新页面加载或更改页面的AJAX请求)?如果是,那么很可能是一个计时问题:有时找不到元素,因为在页面加载时发生了对元素的请求。您应该等待元素存在。然后找到元素并做下一步。
答案 2 :(得分:0)
不确定这是否对您有很大帮助,但是我遇到了类似的问题,其中driver.find_element_by_xpath(...)
最初将返回信息,但是几秒钟后再运行相同的操作将导致'Element Not Found'
异常,因此我导入了时间,并将sleep(2)
后面紧跟着driver.get(...)
,这对我来说是固定的。
希望有帮助。
答案 3 :(得分:-1)
总是试着走绝对路径;否则尝试通过向XPATH添加索引;否则选择相对路径的第三个选项(保持最小)。