使用量角器时element(by.id('username'))和browser.driver.findElement(by.id('username'))之间有什么区别

时间:2019-01-30 07:36:21

标签: angular selenium-webdriver protractor

我想知道两者之间有什么区别

element(by.id('userId')).sendKeys('abc');

browser.driver.findElement(by.id('userId')).sendKeys('abc');

使用量角器时。

我的网站是用angular 6开发的,并且在使用量角器编写一些UI测试时,我很难弄清楚前者根本不适合我。我不得不使用后者使它工作,直到花了几个小时才意识到。

我只是想知道我猜想element(by..)是用在斜角上而有什么区别,而量角器官方网站上给出的示例似乎也在使用前一种方法。

此外,即使使用browser.driver,即使我能够找到元素,但它也不会等待操作完成。单击Login按钮后,以下代码失败。只是想知道什么是正确的方法。

it('should login', function() {
      browser.get('http://localhost:4200');
      browser.driver.findElement(by.id('userId')).sendKeys('abc');
      browser.driver.findElement(by.id('password')).sendKeys('123');
      browser.driver.findElement(by.id('login-button')).click();
      browser.driver.findElement(by.xpath('//span[text()=\'Maintenance\']')).click();
}

3 个答案:

答案 0 :(得分:1)

前者:element(by.id('userId')).sendKeys('abc')是量角器的API,而browser.driver.findElement(by.id('userId')).sendKeys('abc');是硒驱动器命令。

量角器包装了硒驱动器命令以提供其自己的API。量角器提供的API等待角度应用程序中的所有异步操作结束(例如“计时器”,“ https请求”),然后再继续处理队列中的下一条指令。另一方面,驱动程序命令不会等待异步操作完成。

如果前者在您的情况下不起作用,请检查您的应用程序中是否运行了某些计时器。

在角度应用中使用计时器的方法是:

 this.ngZone.runOutsideAngular(() => {
  setTimeout(() => {
    // Changes here will not propagate into your view.
    this.ngZone.run(() => {
      // Run inside the ngZone to trigger change detection.
    });
  }, REALLY_LONG_DELAY);
});

https://www.protractortest.org/#/timeouts

答案 1 :(得分:0)

简单说明:

element(by.id('userId')).sendKeys('abc')->在使用量角器自动进行角度应用时使用。

browser.driver.findElement(by.id('userId')).sendKeys('abc');->在使用量角器自动执行非角度页面时使用。

希望它对您有帮助。

解决方案

 browser.waitForAngularEnabled(true);
 browser.get('http://localhost:4200');
 element(by.id('userId')).sendKeys('abc');
 element(by.id('password')).sendKeys('123');
 element(by.id('login-button')).click();
 element(by.xpath('//span[text()=\'Maintenance\']')).click();

如果您遇到等待问题。尝试添加预期的等待条件。请参阅https://www.protractortest.org/#/api?view=ProtractorExpectedConditions

答案 2 :(得分:0)

尝试使用以下代码段;

browser.wait(function() {
       return element(by.id('userId')).isDisplayed();
    }, 5000);
   element(by.id('userId')).click();.sendKeys() 

并请检查Jasmine API中的任何功能是否在您的代码中正常工作。 Jasmine API命令应适用于任何angular js应用程序。因此,请检查在 browser.get()命令

之后添加 browser.ignoreSynchronization = true 时上述命令是否有效

如果您的茉莉花,网络驱动程序未更新,这也可能是一个问题

祝你好运!