【发布时间】:2017-01-26 09:13:59
【问题描述】:
我需要解析一个包含输入元素的表格。使用 Selenium WebDriver 我得到输入元素的列表以提取它们的值:
@FindBy(xpath = "xpathSelector")
private List<WebElement> table;
我有一个输入元素的例子:
<input id="pt1:r1:3:detailTable:1:j_idt680::content"
name="pt1:r1:3:detailTable:1:j_idt680" style="text-align: right;color:#333333;"
class="af_inputText_content" type="text" value="1,000.00">
遍历输入的 web 元素,我需要获取每个值。
List<String> inputValues = new ArrayList<>();
for (WebElement input : table) {
inputValues.add(getValue(input));
}
我可以使用
input.getAttribute("value");
但这不起作用,因为输入元素已经定义了属性“值”。
我发现在这种情况下我可以使用 JavaScript。这是我正在尝试的代码:
public String getValue(input) {
JavascriptExecutor js = (JavascriptExecutor) driver;
return js.executeScript("return arguments[0].value", element).toString();
}
但我得到的不是真正的值,而是 "dirty",这没有任何意义。
我能够在调试器模式下使用以下方法获得真正的价值:
((JavascriptExecutor)driver).executeScript("return document.evaluate(\"xpathSelector\",
document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.value")
.toString()
如何使用 Selenium Webdriver WebElements 已经找到的 JavascriptExecutor 获取值?
更新:我使用 css 选择器找到了解决该问题的方法,但我不喜欢它:
public String getNthInputValueByCss(String cssSelector, int elementNumber) {
String jsScript = String.format("return document.querySelectorAll(\"%s\")[%d].value", cssSelector, elementNumber);
JavascriptExecutor js = (JavascriptExecutor) driver;
return js.executeScript(jsScript).toString();
}
【问题讨论】:
-
我不明白
return arguments[0].value和input.getAttribute("value");之间的区别我认为两者都会检索相同的数据。区别只是技术上的还是我遗漏了什么? -
@Würgspaß 不幸的是没有。 input.getAttribute("value") 仅当元素没有定义属性“value”时才会返回一个值。以下是我拥有的输入示例,它已经具有属性“值”:
-
您正在测试的页面是否有 jQuery?
-
@Josh No. 该页面没有 jQuery。
标签: javascript java xpath selenium-webdriver