当前位置: 首页 > 知识库问答 >
问题:

Selenium XPath-如何查找前一个元素

左丘修齐
2023-03-14

我在JavaSelenium中运行测试,在那里我找到一个元素,一旦找到就需要找到紧接在前的元素。代码需要是动态的,因为我不知道我开始的元素是5个中的第3个、10个中的第6个还是2个中的第1个。

问题是,使用xpath中的前置兄弟,我得到了找到的元素之前的所有元素,而不是紧接在它之前的元素。例如,这是我的xml:

<div>
    <input formcontrolname="myValues" id="value1" type="radio" value="VALUE1" />
    <label for="value1">Value 1</label>
    <input formcontrolname="myValues" id="value2" type="radio" value="VALUE2" />
    <label for="value2">Value 2</label>
</div>

假设我已经找到了作为WebElement的“Value 2”标签,那么我接下来要做的就是找到该标签前面的特定输入(id='value2')。因为它必须与我找到的标签相关,所以我不能仅仅通过id来查找;我真的不知道id,只是输入应该在标签之前。我想我可以用这个:

WebElement input = element.findElement(By.xpath("preceding-sibling::input"));

但xpath实际上返回标签的同级输入。因此,在这个示例中,我得到了一个由两个输入组成的数组,它们都是“value1”和“value2”。Selenium将输入的值设置为id='value1'的输入,这是返回数组中的第一个。

所以我的问题是,是否有一个xpath可以返回紧跟在给定元素之前的一个元素?

共有3个答案

司空宗清
2023-03-14

根据您共享的HTML查找

.//preceding::input[1]

我仍然觉得您无法正确地表达/提出您的确切用例/需求。一个可能的用例是在单选按钮上调用click(),即在

public void click_radio_button(String label_text)
{
    driver.findElement(By.xpath("//label[.='" + label_text + "']//preceding::input[1]")).click();
}

现在,从您的main()@测试注释类中,您可以调用函数单击单选按钮()将标签文本作为参数传递给相应单选按钮上的单击(),如下所示:

click_radio_button("Value 1")
click_radio_button("Value 2")

最后,为什么要选择前辈而不是前辈?

根据HTML所有<代码>

<div>
    <input formcontrolname="myValues" id="value1" type="radio" value="VALUE1" />
    <label for="value1">Value 1</label>
    <input formcontrolname="myValues" id="value2" type="radio" value="VALUE2" />
    <label for="value2">Value 2</label>
</div>

理想的,

>

在这里,您可以找到关于我应该使用哪个的详细讨论:前面的:: 还是前面的兄弟姐妹::?

邵捷
2023-03-14

我对你告诉司机参考的内容有点困惑。”findElement(按.xpath(“前面的同级::输入”));'没有指定它应该在什么之前。。。。因此,如果您只想查找id为“value”的元素之前的所有内容,那么您的代码应该如下所示:

driver.find_elements_by_xpath("//*[contains(@id, 'value')]]/preceding-sibling::input");

现在,语法假设您知道分号、括号等应该在哪里。。。如果我的语法不对,我会提前道歉。我编写selenium,但只使用Python。

阎麒
2023-03-14

您可以通过指定索引来获得所需的结果:

./preceding-sibling::input[1]

在这种情况下,您将获得"输入"类型的第一个(直接)前置兄弟姐妹

 类似资料:
  • 问题内容: 给定 当我不知道n是什么时,如何选择最后一个’service-n’行?我尝试添加,但是没有用。 我有: 但它选择第一行,而我要最后一行。 我无法使用,因为实际上’service-n’行的数量是动态的,并且变化很大。 问题答案: 答案正是我把[last()]放在哪里,我把它放在错误的地方 它在这里: 不在这里:

  • 我正在为以下代码编写selenium脚本。 这些是如下所示的复选框。复选框的数量将根据数据库值进行更改。 在我的代码中,我首先检查是否选中了“Frau”复选框。所以我试着按照这个片段。 但是当我试图执行这个脚本时<代码>WebElement div=父级。findElement(By.xpath(“前面的同级:::div”)给我第一个div标记,而不是前一个。我想要一个兄弟姐妹。

  • 我刚刚开始玩Java 8 lambda,我正在尝试实现一些我在函数式语言中习惯的东西。 例如,大多数函数语言都有某种对序列进行操作的find函数,或返回第一个元素的列表,该元素的谓词为。我能看到的在《Java八号》中实现这一点的唯一方法是: 然而,这似乎没有效率,因为过滤器将扫描整个列表,至少在我的理解(这可能是错误的)。有更好的办法吗?

  • 我试图自动化YouTube搜索,点击搜索结果,然后跟随右侧的推荐视频。我写的代码进入youtube,进行搜索,点击视频,视频就会在浏览器上打开。但是,我不能带它点击其中一个推荐的视频。 问题似乎在于,当我使用从右边获取推荐视频元素的列表时,我得到的是上一页的列表(当我第一次输入单词并获得搜索结果时)。 当我使用直接转到视频链接时,代码确实可以正常工作,而不是先进行搜索。 所以当我点击(最后一行)时

  • 问题内容: 我无法使用Beautifulsoup解析具有“ class”属性的HTML元素。代码看起来像这样 脚本完成后的同一行出现错误。 如何摆脱这个错误? 问题答案: 您可以使用BS3优化搜索以仅找到具有给定类的那些div:

  • 我有以下从一个网页简化的HTML... 需要以下XPath选择条件... col-md-3 div内的输入标记,该标记紧接在包含class=manditional的span的col-md-3 div之后 输入标记不应隐藏 上面HTML中的以下元素与搜索条件匹配 (请注意,ID中的数值是动态分配的,在搜索文档时我不会知道。) 在添加任何前一种兄弟检查之前,这是我的....