Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xpath Selenium:如何使用精确文本匹配定位节点_Xpath_Selenium - Fatal编程技术网

Xpath Selenium:如何使用精确文本匹配定位节点

Xpath Selenium:如何使用精确文本匹配定位节点,xpath,selenium,Xpath,Selenium,我想使用文本在网页上定位元素。 我知道有一个方法名包含这样做,例如: tr[contains(.,'hello')]/td 但问题是,若我有两个元素名hello和hello1,那个么这个函数就不能正常工作 有没有其他方法像contains这样精确匹配字符串以定位元素?好吧,您的问题是您正在tr中搜索文本(无论如何都不正确),这会导致函数contains出现问题,该函数无法接受文本列表。请尝试改用此位置路径。它应该检索您想要的内容 //tr/td[contains(./text(),"hello

我想使用文本在网页上定位元素。
我知道有一个方法名包含这样做,例如:

tr[contains(.,'hello')]/td
但问题是,若我有两个元素名hello和hello1,那个么这个函数就不能正常工作


有没有其他方法像contains这样精确匹配字符串以定位元素?

好吧,您的问题是您正在tr中搜索文本(无论如何都不正确),这会导致函数
contains
出现问题,该函数无法接受文本列表。请尝试改用此位置路径。它应该检索您想要的内容

//tr/td[contains(./text(),"hello")]
此位置路径将检索一组节点,您必须在这些节点上迭代才能获取文本。您可以尝试附加

/text()
但这将导致(至少在我的测试中)一个结果是一个字符串,它是所有匹配字符串的串联

tr[.//text()='hello']/td
这将选择所有tr元素的所有td子元素,该tr元素的子元素中有一个确切的“hello”。这样的XPath对我来说仍然很奇怪

我认为这更有意义:

tr/td[./text()='hello']
因为它只选择包含文本的td


这有帮助吗?

这完全取决于HTML实际包含的内容,但是您的
tr[contains(,'hello')]/td
XPath选择器表示“第一行的第一个单元格,其中包含字符串'hello',在其中的任何位置”(或者更准确地说,“tr元素中包含字符串'hello'的第一个td元素”,因为硒不知道所涉及的元素真正起什么作用)。这就是为什么当有包含“hello”和“hello1”的行时会得到错误的结果——这两个行都包含“hello”


选择器
tr[.='hello']/td
会更准确,但它有点不寻常(因为HTML tr元素不应该包含文本-文本应该在tr中的TH或td元素中),而且可能不起作用(因为任何其他单元格中的文本都会破坏比较)您可能需要tr[td[.='hello']]/td,这意味着“tr元素中包含的第一个td元素包含一个td元素,该元素的完整文本为字符串'hello'。

我也有同样的问题。我有一个元素列表,一个名为“图像”,另一个名为“文本和图像”。在阅读了这里的所有帖子后,没有一条建议对我有用。因此,我尝试了以下方法,效果很好:

List<WebElement> elementList = new ArrayList<WebElement>();
elementList = driver.findElements(By.xpath("//*[text()= '" +componentName+"']"));

for(WebElement element : elementList){
    if(element.getText().equals(componentName)){
       element.click();
    }
}
List elementList=new ArrayList();
elementList=driver.findElements(By.xpath(“/*[text()=”“+componentName+”]);
for(WebElement:elementList){
if(element.getText().equals(componentName)){
元素。单击();
}
}

你说的“工作不正常”是什么意思?意外的行为是什么?如果我们有两个元素,分别是文本hello和hello1,当我们使用contains(,'hello')时,这个方法将始终查找hello。问题如果这些元素在表中,hello1是第一个元素,hello是第二个元素,当我们使用contains hello时,它将始终指向hello1,因为它是第一个元素,包含hello,但我们希望搜索hello,这就是我需要精确匹配方法的原因在TR元素上使用
contains(,whatever)
没有错,虽然这可能不是阿比纳夫真正想要的
self::node()
的缩写,而不是
子代或self::text()
,因此它会导致TR及其所有子代转换为字符串、连接和比较,而不是寻找一个匹配的文本节点。@RossPatterson事实上,如果你编写了一个好的代码,tr下没有文本,只有一个(或多个)td。考虑到这一点,我说了“无论如何都是不正确的”。多亏了这篇文章,我才学会了。='text'技巧。谢谢@Ross Patterson!在这种情况下,您可以使用//td[.='hello']精确匹配页面上的任何td,以查找包含精确“hello”的任何td单元。除非您希望确保td位于tr内,否则可能不需要tr。