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

时间:2018-02-23 15:27:22

标签: java selenium xpath

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

问题是,使用xpath中的previous-sibling,我得到找到的元素之前的所有元素,而不是紧接在它之前的元素。例如,这是我的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>

让我们说我找到了&#39;价值2&#39;标签作为WebElement,然后我想做的是找到紧接在该标签之前的特定输入(id =&#39; value2&#39;)。因为它必须与我找到的标签相关,所以我无法通过该ID找到;我真的不知道id,只是输入应该在标签之前。我以为我可以用这个:

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

但是xpath实际上返回了标签兄弟的所有输入。所以,在这个例子中,我得到了一个返回两个输入的数组,这两个输入都是&#39; value1&#39;和&#39; value2&#39;。 Selenium将 input 的值设置为id =&#39; value1&#39;的输入,是返回数组中的第一个。

所以我的问题是,是否有一个xpath将返回立即在给定元素之前的一个元素?

3 个答案:

答案 0 :(得分:0)

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

./preceding-sibling::input[1]

在这种情况下,您将获得"input"

类型的第一个(直接)前置兄弟

答案 1 :(得分:0)

根据 HTML ,您已共享<input>id="value2" <label> Value 2 xpath,您可以使用以下内容.//preceding::input[1]

click()

更新

我仍然觉得您无法正确表达/提出您的确切用例/要求。可能的用例可能是单选按钮上调用<input>,即在<label>标记上调用标签public void click_radio_button(String label_text) { driver.findElement(By.xpath("//label[.='" + label_text + "']//preceding::input[1]")).click(); } 标签。如果这是你的 usecase ,更好的方法是编写一个函数,如下所示:

main()

现在,您可以在@Testclick_radio_button()注释课程中调用函数 click() ,将标签文字作为参数传递在单选按钮click_radio_button("Value 1") click_radio_button("Value 2") ,如下所示:

<input>

最后,你为什么要选择前面的而不是前兄弟

根据 HTML ,所有<label><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> 节点都在同一步,如下所示:

preceding-sibling::parentNode/childNode[n]

理想地,

答案 2 :(得分:0)

我对你告诉司机引用的内容感到有点困惑。 'findElement(By.xpath() “::输入同胞前述”);'没有指定它应该在...之前的内容....所以如果你想要做的就是找到ID为'value'的任何元素之前的所有内容,那么你的代码应该是这样的:

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

现在语法假设你知道你的分号,括号等应该在哪里......如果我的语法不正确,我会提前道歉。我写的是selenium,但仅限于Python。

相关问题