2017-01-25 55 views
0

硒的webdriver获得的输入值,我需要解析包含在里面输入元素的表。使用硒的webdriver我得到的输入元素的列表,并提取其值:已经具有价值属性(JAVA)

@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"); 

但是,这并不工作,因为输入元素已经有一个定义的属性“值”。

我发现,在这种情况下,我可以使用JavaScript。这是我想要的代码:

public String getValue(input) { 
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    return js.executeScript("return arguments[0].value", element).toString(); 
} 

但不是真正的价值我得到“脏”不作任何意义。

我能够用得到的调试器模式的真正价值:

((JavascriptExecutor)driver).executeScript("return document.evaluate(\"xpathSelector\", 
document, null, XPathResult.FIRST_ORDERED_NODE_TYPE,null).singleNodeValue.value") 
.toString() 

我怎样才能获得通过JavascriptExecutor值已经使用硒的webdriver WebElements发现了什么?

更新:我发现使用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'和'input.getAttribute(“value”)之间的区别;'我认为两者都会检索相同的数据。差异只是技术上的还是我错过了什么? –

+0

@Würgspaß不幸的不是。 input.getAttribute(“value”)只有在元素没有定义属性“value”时才会返回值。以下是我输入的示例,它已具有属性“值”: Aliaksei

+0

你正在测试的页面是否有jQuery? – Josh

回答

0

如何通过JavaScript所获得的价值属性之前先移除属性的值?这也是一个解决办法,但也许你会喜欢吗?

+0

这可能是一个解决方案,但我认为不是一个优雅的。在测试期间更改DOM是否是一种很好的做法? 顺便提一下我找到的解决方案。 – Aliaksei

+0

你的意思是css选择器之一?或者与JavaScript的xpath的?顺便说一下,这是什么意思:我如何通过使用Selenium Webdriver WebElements找到的JavascriptExecutor获取值? – becixb

0

我的进一步研究使我找到了使用cssSelector的解决方案。

从文档到硒的webdriver executeScript(String script, Object... args)方法:

的参数将通过 “参数”神奇变量被提供给JavaScript,仿佛功能被称为通过 “Function.apply”

参数必须是上述任意组合的数字,布尔值,字符串,WebElement或列表 。

@param ARG游戏的脚本变量的情况。可能是空的

解决方案:

因此,我们可以通过我们的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(); 
}