Selenium Web Driver(Firefox)能否读取注入的AngularJS ng-model初始值?

4

我有一个文本输入框,使用ng-model绑定到一个javascript对象。该javascript对象为该字段提供了初始值。

<input class="class1 class2" type="text" ng-model="scopeVar"></input>

scopeVar是一个文本值。

当页面加载时,Selenium(使用火狐驱动程序)可以找到输入字段,验证它是否可见,可以输入文本到该字段中,然后读取该文本,但无法读取最初在字段中的文本。

如果我在火狐浏览器窗口中执行$('.class1.class2').val(),它会返回预期的默认值。

如果我执行((JavascriptExecutor) driver).executeScript("$('.class1.class2').val()"),它会返回null。如果我执行driver.driver.findElement(By.cssSelector(".class1.class2")).getText(),它也会返回null。

因此,看起来Angular正确地填充了DOM(就jQuery而言),但Selenium Web Driver无法读取它。

注意:在尝试读取之前,我确实验证了是否有元素并且它是可见的。

感谢您的帮助。


作为更新...如果我在IDE中停止测试并在字段中键入一个值,Selenium可以看到键入的值并从那时起操作所有结果。如果我在直接在浏览器中键入字段之前使用element.sendKeys()或javascriptExecutor.executeScript("$('.class1.class2').val('foo')")设置值,则浏览器显示会更新,但调用任何读取方法都会返回null(或空字符串),并且执行javascriptExecutor.executeScript("$('.class1.class2').blur()")会导致默认值被重新显示(尽管无法读取)。 - cWarren
1个回答

6

我不知道你的应用程序具体情况,但这适用于与ng-model映射的输入字段:

    WebDriver wd = new FirefoxDriver();
    wd.get("http://jsfiddle.net/SAWsA/11/show/");
    WebElement input = wd.findElement(By.tagName("input"));
    input.sendKeys("hello");
    input = wd.findElement(By.tagName("input"));
    System.out.println("fieldValue=" + input.getAttribute("value"));
    wd.quit();

还有一个与Java相关的ngWebDriver


问题出在读取初始值上。如果您将默认值添加到输入标记$scope.query="query goes here";,然后在发送键之前尝试检索该值:String s = input.getText(); System.out.println( "initialValue="+s);,您会发现结果是一个空字符串。 - cWarren
虽然这个答案并没有直接解决问题,但它提供了答案。与其使用input.getText(),我应该使用input.getAttribute("value"),尽管为什么这对Selenium有影响我不知道。 - cWarren
获取字段的getAttribute("value")在WebDriver中一直是正确的。您的问题仍未解决吗?您能否制作一个完整的测试用例以重现问题? - paul_h
我还有一个问题。为什么JavaScript执行器返回的值与在网页控制台中输入相同的JavaScript不同? - cWarren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接