我在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将返回立即在给定元素之前的一个元素?
答案 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()
现在,您可以在@Test
或click_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]
理想地,
which is not your usecase
(preceding::node[n]
)原型 前面应该有 which exactly matches your usecase
(union all
)
您可以在此处找到有关Which should I use: preceding:: or preceding-sibling::?
答案 2 :(得分:0)
我对你告诉司机引用的内容感到有点困惑。 'findElement(By.xpath() “::输入同胞前述”);'没有指定它应该在...之前的内容....所以如果你想要做的就是找到ID为'value'的任何元素之前的所有内容,那么你的代码应该是这样的:
driver.find_elements_by_xpath("//*[contains(@id, 'value')]]/preceding-sibling::input");
现在语法假设你知道你的分号,括号等应该在哪里......如果我的语法不正确,我会提前道歉。我写的是selenium,但仅限于Python。