我为Web应用程序的e2e进行了一系列Protractor测试。由于底层的Angular4代码,有很多输入框,其中大多数都有ng-reflect-name
属性。这是一个示例HTML代码段
<input _ngcontent-c6="" class="input ng-untouched ng-pristine ng-invalid ui-inputtext
ui-corner-all ui-state-default ui-widget" formcontrolname="email" pinputtext=""
placeholder="Enter Email Address" spellcheck="false" type="text" ng-reflect-name="email">
我的问题是关于在这里使用定位器。如果我将此代码用于此特定输入框 -
element(by.css('[formcontrolname='email']'))
并执行任何sendKeys()
操作,它完全没问题。
但是,如果我使用这个定位器
element(by.css('[ng-reflect-name="email"]'))
我的测试第一次成功运行,但错误输出后续运行NoSuchElementException
。我搜索过SO和Angular文档,但我似乎无法解释为什么会发生这种情况。如果有人以前遇到过这个问题,你能解释一下这里发生了什么吗?
答案 0 :(得分:2)
由于ng-reflect-*
有for debugging purposes,我不会依赖它们上的定位器。
我怀疑the function that adds ng-reflect-*
attributes在Angular确认&#34;准备就绪&#34;之前不一定表现出来。到量角器(每个量角器&#34;命令&#34;与Angular进行同步)。换句话说,在您搜索输入时,尚未在元素上设置ng-reflect-name
。
如果您仍然要继续使用ng-reflect-*
属性,请尝试添加Explicit Wait以等待元素出现:
var EC = protractor.ExpectedConditions;
var emailInput = element(by.css('[ng-reflect-name=email]'));
browser.wait(EC.presenceOf(emailInput), 5000);
emailInput.sendKeys("test@test.com")