我正在尝试通过Protractor测试我的网站,这是一个非角度的网站。我的代码是:
describe("Supplier Portal: Login ", function () {
//ui.setSmallScreenSize();
// ui.testLogger(100);
it("test", co.wrap(function* () {
browser.ignoreSynchronization = true;
yield browser.driver.get("https://cit.supplier.ext.here.com/");
yield element(by.xpath("//*[@id=\"rnav\"]/li[2]/a")).click();
var elmOK = element(by.xpath( "//*[@id=\"sign-in-email\"]"));
browser.driver.wait(protractor.until.elementIsVisible(elmOK.getWebElement()))
}));
});
但是当我尝试执行代码时出现以下错误:
Failed: No element found using locator: By(xpath, //*[@id="sign-in-email"])
但元素在网站上。
请告知我做错了什么
答案 0 :(得分:1)
由于您正在处理非角度站点并使用browser.ignoreSynchronization = true
,因此Protractor不会等待angular
变量变为可用,因此它会开始触发测试,因为它认为应用已准备就绪,更多信息here。
您需要使用Control Flow操纵Expected Conditions,以便Protractor知道它正在等待某事。这将使您的测试更加一致和可靠。
一些指导你的例子:
等待元素加载/出现在DOM中:
var EC = protractor.ExpectedConditions;
var ele = element(by.css('div.class'));
browser.wait(EC.presenceOf(ele), 5000);
我传入的5000参数值表示等待最大为5秒,如果在5秒内不存在则失败。
等待元素可见:
browser.wait(EC.visibilityOf(ele), 5000);
等待元素可点击:
browser.wait(EC.elementToBeClickable(ele), 5000);
同样,重要的是要注意这些是隐式等待,并且它们将等待提供的时间参数的最大。这不是一个有保证的等待时间,当他们找到你告诉它等待的元素时,他们会尽快开火。