【问题标题】:Selenium Webdriver get input value which already has value attribute (Java)Selenium Webdriver获取已经具有值属性的输入值(Java)
【发布时间】: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].valueinput.getAttribute("value"); 之间的区别我认为两者都会检索相同的数据。区别只是技术上的还是我遗漏了什么?
  • @Würgspaß 不幸的是没有。 input.getAttribute("value") 仅当元素没有定义属性“value”时才会返回一个值。以下是我拥有的输入示例,它已经具有属性“值”:
  • 您正在测试的页面是否有 jQuery?
  • @Josh No. 该页面没有 jQuery。

标签: javascript java xpath selenium-webdriver


【解决方案1】:

在获取 value 属性之前先通过 javascript 删除 value 属性怎么样?这也是一种解决方法,但也许您会更喜欢它?

【讨论】:

  • 这可能是一个解决方案,但我认为这不是一个优雅的解决方案。在测试期间更改 DOM 是一种好习惯吗?顺便说一句,看看我找到的解决方案。
  • 你的意思是css选择器之一?还是带有xpath for javascript的那个?顺便说一句,这是什么意思:如何使用 Selenium Webdriver WebElements 已经找到的 JavascriptExecutor 获取值?
【解决方案2】:

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

从文档到 Selenium WebDriver executeScript(String script, Object... args) 方法:

这些参数将通过 "arguments" 魔法变量,就好像该函数是通过调用 "函数.应用"

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

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

【讨论】:

    猜你喜欢
    • 2015-05-06
    • 2013-07-17
    • 2012-06-24
    • 2018-08-02
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2018-11-03
    • 2014-03-08
    相关资源
    最近更新 更多