【问题标题】:After input for an email address I need the driver to push tab twice输入电子邮件地址后,我需要司机按两次标签
【发布时间】:2015-08-07 23:23:06
【问题描述】:

我有一个向网站添加用户的模式。首先需要添加一个电子邮件地址,然后检查服务器以查看电子邮件是否已在用户列表中。接下来需要添加名字、姓氏等。问题是直到我在输入框外单击或单击两次标签后,才针对服务器检查电子邮件。在完成此检查之前,名字、姓氏等都是只读的,并且元素不可见,因此我无法进一步填写表格。

这是我尝试过的代码:

element.all(by.css("input[type$='text']")).first().sendKeys(protractor.Key.TAB);
browser.driver.sleep(3000);
//below is the first name element
element(by.xpath("(//input[@type='text'])[2]")).sendKeys("a First Name");

 element.all(by.css("input[type$='text']")).first().sendKeys('anemailaddy@newmarketinc.com', protractor.Key.TAB); //.browser.actions().sendKeys(protractor.Key.TAB).perform();

以上注释掉的行是不同方式的尝试。我也试过这个:

最后一个问题,电子邮件地址是您在上面看到的元素,名字、姓氏等都在一个数组中。要访问名字栏,是否将 input[type$='text']:nth-of-type(2) 作为列表中的第二个?

页面 HTML:

<div class="dialog-overlay" ng-class="{visible: usersCtrl.editPermissionsVisible}">
  <div class="edit-user-dialog">
    <div class="dialog-header">
      <div class="dg-title-text">Edit a User&#39;s Permissions</div>
      <span class="icon icon-close" ng-click="usersCtrl.hideEditPermissions()"></span>
    </div>
    <div class="dialog-content">
      <div class="dg-row">
        <div>
          <span class="dg-field-label">Email:</span>
          <span class="dg-field-error " ng-bind="text = usersCtrl.invalidEmailMessage"></span>
        </div>

        <input type="text" class="dg-field-input" ng-model="usersCtrl.user.email" ng-blur="usersCtrl.onChangeEmail()" ng-disabled="!usersCtrl.addUserVisible" />
      </div>
      <div class="dg-row">
        <div class="dg-cell col-2">
          <span class="dg-field-label">First Name:</span>
          <input type="text" class="dg-field-input" ng-model="usersCtrl.user.firstName" ng-disabled="usersCtrl.editPermissionsVisible || usersCtrl.searchNotStartOrSuccess" />
        </div>
        <div class="dg-cell col-2">
          <span class="dg-field-label">Last Name:</span>
          <input type="text" class="dg-field-input" ng-model="usersCtrl.user.lastName" ng-disabled="usersCtrl.editPermissionsVisible || usersCtrl.searchNotStartOrSuccess" />
        </div>
      </div>
      <div class="dg-row">
        <span class="dg-field-label">Title:</span>
        <input type="text" class="dg-field-input" ng-model="usersCtrl.user.title" ng-disabled="usersCtrl.editPermissionsVisible || usersCtrl.searchNotStartOrSuccess" />
      </div>
      <div class="dg-row">
        <div class="checkbox-control" ng-click="usersCtrl.permissions.toggleContentManagement()">
          <span class="checkbox-mark svg-icon" ng-class="{'icon-check-on': usersCtrl.permissions.allowContentManagement}"></span>
          <span class="checkbox-text bold">Allow Access to iPlan Content Management System</span>
        </div>
      </div>
      <div class="dg-row content-management">
        <div class="checkbox-column" ng-repeat="permission in usersCtrl.permissions.contentManagement" ng-if="permission.canIssue">
          <div class="checkbox-control" ng-click="!usersCtrl.isDisabledPermission(permission) && usersCtrl.togglePermission(permission)" ng-class="{disabled: usersCtrl.isDisabledPermission(permission)}">
            <span class="checkbox-mark svg-icon" ng-class="{'icon-check-on': permission.value}"></span>
            <span class="checkbox-text">{{permission.displayName}}</span>
          </div>
        </div>
        <div class="clearfix"></div>
      </div>
      <div class="dg-row ">
        <div class="checkbox-control" ng-click="usersCtrl.togglePermission(usersCtrl.permissions.manageUsers)">
          <span class="checkbox-mark svg-icon" ng-class="{'icon-check-on': usersCtrl.permissions.manageUsers.value}"></span>
          <span class="checkbox-text bold">{{usersCtrl.permissions.manageUsers.displayName}}</span>
        </div>
      </div>

【问题讨论】:

    标签: javascript angularjs selenium selenium-webdriver protractor


    【解决方案1】:

    “TAB”方法不适合您的原因是您可能会遇到Chrome version 44 has some issue with selenium test 问题。在这种情况下,您需要尝试使用最新的 Chrome 或 Firefox。

    最后一个问题是电子邮件地址是您在上面看到的元素, 名字,姓氏等在一个数组中。访问名字栏 是否将 input[type$='text']:nth-of-type(2) 作为它的第二个 列表?

    定义一次输入列表并使用first()get()last()

    var inputs = element.all(by.css("input[type$='text']"));
    var email = inputs.first();
    
    email.sendKeys("anemailaddy@newmarketinc.com", protractor.Key.TAB, protractor.Key.TAB);
    
    inputs.get(1).sendKeys("a First Name");
    

    您也可以尝试在模态框外点击,例如:

    browser.actions().mouseMove({x: 5, y: 5}).click().perform();
    

    【讨论】:

    • 我尝试了代码,我得到了失败:无效元素状态(会话信息:chrome=44.0.2403.125)(驱动程序信息:chromedriver=2.15.322448(52179c1b310fec1797c81ea9a203268398 60b7d3),平台=Windows NT 6.1 SP1 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:122 毫秒
    • @NicolePhillips 是的,您遇到的错误可能是因为在验证电子邮件后元素实际上已更改。我认为您可能对by.name() 定位器有更好的运气。请提供表单的 HTML,我们会想出更好的方法来定位元素。谢谢。
    • @NicolePhillips 好!我认为您应该按型号定位元素:element(by.model("usersCtrl.user.email"))element(by.model("usersCtrl.user.firstName"))
    • 我试过了,得到了这个错误:失败:未知错误:[ng:test] 没有为 g etTestability 的元素参数找到注入器
    • @NicolePhillips 好吧,这可能是一个不同的问题,请参阅 stackoverflow.com/questions/28040078/…..
    猜你喜欢
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 2014-04-28
    • 2020-03-27
    • 2018-09-14
    相关资源
    最近更新 更多