我需要解析一个包含输入元素的表。使用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">
通过输入网络元素进行迭代,我需要获得每个值。
List<String> inputValues = new ArrayList<>();
for (WebElement input : table) {
inputValues.add(getValue(input));
}
我可以用
input.getAttribute("value");
但这不起作用,因为输入元素已经具有已定义的属性&#34;值&#34;。
我发现在这种情况下我可以使用JavaScript。这是我尝试的代码:
public String getValue(input) {
JavascriptExecutor js = (JavascriptExecutor) driver;
return js.executeScript("return arguments[0].value", element).toString();
}
但我没有真正的价值观,而是&#34;脏&#34; ,这没有任何意义。
我能够使用以下方法在调试器模式下获得真正的价值:
((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();
}
答案 0 :(得分:0)
如何在获取value属性之前先通过javascript删除value属性?这也是一种解决方法,但也许你会更喜欢它?
答案 1 :(得分:0)
我的进一步研究使我得到了一个使用cssSelector的解决方案。
从文档到Selenium WebDriver executeScript(String script, Object... args)
方法:
这些参数将通过以下方式提供给JavaScript &#34;参数&#34;魔术变量,好像该函数是通过调用的 &#34; Function.apply&#34;
参数必须是数字,布尔值,字符串,WebElement或List 以上任何组合。
@param args脚本的参数。可能是空的
<强>解决方案:强>
因此,我们可以将WebElement element
作为executeScript()
方法的参数之一传递,然后使用该参数在element
的子项中进行搜索。
protected String getInputValue(WebElement element) {
String js = "return arguments[0].querySelector('input').value";
JavascriptExecutor js = (JavascriptExecutor) driver;
return js.executeScript(js, element).toString();
}