为了账号安全,请及时绑定邮箱和手机立即绑定

XPATH 找不到 Web 上包含的文本 - 使用 contains(text())

XPATH 找不到 Web 上包含的文本 - 使用 contains(text())

largeQ 2022-05-24 18:09:40
在这个网站上https://classicdb.ch/?quest=788我试过:driver.find_element_by_xpath(                "//div[contains(text(), 'Start')]").text它找到元素并返回'Start: Kaltunk'但是,当我尝试查找包含“End”的元素时,它什么也找不到。driver.find_element_by_xpath(                "//div[contains(text(), 'End')]").text为什么是这样?
查看完整描述

1 回答

?
浮云间

TA贡献1829条经验 获得超4个赞

尝试使用以下 xpath。

//table//div[contains(.,'End:')]

截屏:

//img1.sycdn.imooc.com//628caefc000112e505010309.jpg

说明:编辑 1

首先让我们看看text()target 下有多少个节点div

//img1.sycdn.imooc.com//628caf08000162f410730122.jpg

所以 div 有 3 个文本节点。


让我详细说明 OP 使用的原始 xpath。


//div[contains(text(), 'End')]

 ^div present anywhere in the document

     ^which contains

               ^the **first** text() node with string value as `End`

当contains()作为它的第一个参数(在div[argument]中)给出时,它采用第一个节点的字符串值,但出现在第二个文本节点中,而不是第一个。这就是 xpath 不起作用的原因。End


我们有 2 个选项来处理这个问题。


1) 使用 text() 作为第一个参数- 通过这种方式,它将获取当前上下文下的所有文本节点,然后contains()用作条件来检查text()将匹配其值包含的任何 text() 节点的值End,如下所示。


//div[text()[contains(., 'End')]]

^div present any where in the document

     ^which have text() node

             ^ that contains 'End`

检查以下屏幕截图:

//img1.sycdn.imooc.com//628caf150001a86606830195.jpg

到这个时候,你会问为什么//div[contains(text(), 'Start')]OP 使用的第一个 xpath ( ) 有效?

如果您查看 div 中关联的 text() 节点,Start文本存在于第一个 text() 节点本身中,这就是他能够使用该 xpath 的原因。

//img1.sycdn.imooc.com//628caf210001e1a110630126.jpg

2)使用。检查当前节点上下文简单来说,当您说.它将检查整个当前元素上下文的End.

//div[contains(.,'End')]

如果您不将 scopt 限制为//table(在 xpath 的开头),您将获得 5 个 div,因为原始 div 的祖先 div 具有此文本也与 xpath 匹配。所以限制在表格中检查的范围,比如`//table//div[contains(.,'End')]


查看完整回答
反对 回复 2022-05-24
  • 1 回答
  • 0 关注
  • 313 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号