【问题标题】:Angular + Selenium: Cannot get value from input fieldAngular + Selenium:无法从输入字段中获取值
【发布时间】:2015-10-02 21:16:21
【问题描述】:

我已经在 Protractor 中编写了我的测试并且我使用了一个期望语句:

loginPage.email.sendKeys( params.login.email );
expect(loginPage.email.getText()).toEqual( params.login.email );

但是,我的测试失败了,因为 signUpPage.email.getText() 返回一个空字符串。我在 Selenium 的文档中找不到为输入字段调用什么函数以返回正确的值?

在我的 Protractor.conf 文件中:

 params: {
      login: {
        email: 'user@email.com',
        password: 'blahblah123'
      }

终端错误:

预期 '' 等于 'user@email.com'。

所以我试图匹配电子邮件字段的输入与我发送的电子邮件地址相同。有什么建议如何在 Selenium 中做到这一点?

【问题讨论】:

    标签: javascript angularjs selenium selenium-webdriver protractor


    【解决方案1】:

    如果这是input字段,则需要获取value属性的值

    expect(loginPage.email.getAttribute("value")).toEqual(params.login.email);
    

    同样,在这里应用 Saifur 的想法,如果需要等待元素包含所需的值,请使用textToBePresentInElementValue Expected Condition

    var EC = protractor.ExpectedConditions;
    browser.wait(EC.textToBePresentInElementValue(loginPage.email, params.login.email), 5000);
    

    请注意,必须指定超时值(以毫秒为单位)。

    【讨论】:

    • 谢谢亚历克斯,最后我错过了超时组件,并且在我阅读 Saifur 的链接时最初没有选择它!
    • 你的回答更准确。我完全错过了超时。
    • "获取value 属性的值"。没有。 99.99..% 的开发人员想要的不是value 属性 的值,而是value 属性 的值。当input 被用户更改时,property 会发生什么变化,而 attribute 保持不变(除非添加了代码来更改它)。由于无限缺乏智慧,Selenium 开发人员决定对 .getAttribute("value") 进行特殊处理,并返回 property 的值而不是 attribute 的值。当人们直接使用 DOM 或其他工具时,这肯定会误导人们。
    • 大家好,我遇到了这个问题:TypeError: Cannot read property 'bind' of undefined您之前处理过这个问题有什么好运气吗?
    • @Louis 说得好!我喜欢阅读您详细的 cmets 和答案,总能学到新的东西。
    【解决方案2】:

    如果您想仅使用 WebDriver 实例获取由 AngularJS 管理的输入字段的值,那么有一种简单的方法可以实现。

    我使用 FirefoxWebDriver 对其进行了测试,它运行良好。

    基本上,您必须使用 JavascriptExecutor 在浏览器中执行 javascript 代码。

    如果你的 web 项目有 jQuery 插件,那么你可以使用以下方法:

    WebDriver driver = DriverFactory.getDriver();
    
    public String getTextAt(String cssId) {
        if (driver instanceof JavascriptExecutor) {
            JavascriptExecutor javascriptExecutor = (JavascriptExecutor) driver;
            return (String) javascriptExecutor.executeScript("return $('" + cssId + "').val();");
        }
        return null;
    }
    

    如果你想使用原始 javascript,你可以这样做:

    WebDriver driver = DriverFactory.getDriver();
    
    public String getTextAt(String cssId) {
        if (driver instanceof JavascriptExecutor) {
            JavascriptExecutor javascriptExecutor = (JavascriptExecutor) driver;
            return (String) javascriptExecutor.executeScript("return documenet.getElementById('" + cssId + "').value;");
        }
        return null;
    }
    

    请注意,在这种情况下 cssId 应该是一个 id 属性。

    【讨论】:

      【解决方案3】:

      可能元素加载时间是这里的问题。在这种情况下,您可以使用ExpectedCondition,甚至可以匹配您要查找的文本。

      var EC = protractor.ExpectedConditions;
      browser.wait(EC.textToBePresentInElement(loginPage.email ,params.login.email));
      

      更新 错过了预期条件的时间。谢谢@alecxe

      browser.wait(EC.textToBePresentInElementValue(loginPage.email, params.login.email), 5000);
      

      【讨论】:

      • Saifur,我已经尝试过 EC.textToBePresentInElement 和 EC.textToBePresentInElementValue ,但运气不佳。我收到TypeError: Cannot read property 'bind' of undefined。不过,感谢您的链接,因为它非常有用!
      猜你喜欢
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 2014-02-11
      • 2022-12-09
      • 1970-01-01
      • 2018-10-01
      • 2018-03-26
      • 1970-01-01
      相关资源
      最近更新 更多