Selenium Webdriver获取已具有value属性的输入值(Java)

时间:2017-01-25 16:02:55

标签: javascript java xpath selenium-webdriver

我需要解析一个包含输入元素的表。使用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();
}

2 个答案:

答案 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();
}