我正在尝试将Protractor用于我们的应用程序。不幸的是,初始登录页面是非Angular的,因此我必须使用ExpectedConditions处理所有隐式等待。在下面的代码片段中,从不执行click()。相反,测试会超时等待下一页显示。在控制台输出中(也粘贴在下面)我看到链接已找到,但我没有看到后续点击操作。
var signUpLink = element(by.id('sign-up-link'));
var isLinkClickable = EC.elementToBeClickable(signUpLink);
browser.wait(isLinkClickable, 5000).then(function() {
signUpLink.click();
});
var isWidgetVisible = EC.visibilityOf(element(by.id('email')));
browser.wait(isWidgetVisible, 5000, 'Sign Up Page is too slow');
这是控制台输出的片段:
12:54:17.404 INFO - Executing: [find elements: By.id: sign-up-link])
12:54:18.002 INFO - Done: [find elements: By.id: sign-up-link]
12:54:18.006 INFO - Executing: [is enabled: 0 [[ChromeDriver: chrome on MAC ()] -> id: sign-up-link]])
12:54:18.141 INFO - Done: [is enabled: 0 [[ChromeDriver: chrome on MAC ()] -> id: sign-up-link]]
12:54:18.147 INFO - Executing: [find elements: By.id: sign-up-link])
12:54:18.755 INFO - Done: [find elements: By.id: sign-up-link]
12:54:18.760 INFO - Executing: [is displayed: 0 [[ChromeDriver: chrome on MAC ()] -> id: sign-up-link]])
12:54:18.770 INFO - Done: [is displayed: 0 [[ChromeDriver: chrome on MAC ()] -> id: sign-up-link]]
12:54:18.774 INFO - Executing: [find elements: By.id: sign-up-link])
12:54:18.780 INFO - Done: [find elements: By.id: sign-up-link]
12:54:18.787 INFO - Executing: [is enabled: 0 [[ChromeDriver: chrome on MAC ()] -> id: sign-up-link]])
12:54:18.791 INFO - Done: [is enabled: 0 [[ChromeDriver: chrome on MAC ()] -> id: sign-up-link]]
12:54:18.805 INFO - Executing: [find elements: By.id: email])
12:54:18.815 INFO - Done: [find elements: By.id: email]
编辑 - 5月10日 我通过添加一个明确的等待(喘息!)来实现它。我不知道为什么会这样。为什么链接被点击需要这么长时间?
var signUpLink = element(by.id('sign-up-link'));
var isLinkClickable = EC.elementToBeClickable(signUpLink);
browser.wait(isLinkClickable, 5000);
browser.driver.sleep(3000); // I give up
signUpLink.click();
答案 0 :(得分:0)
根据您分享的内容,我最好的猜测是,当DOM中的元素仍然呈现时,链接变为可点击。最终结果是满足等待条件,计划单击事件,但在点击发生之前,将呈现新元素,将链接转移到其他位置,以便点击实际上不会到达链接。我知道这听起来很牵强,但我在一个正在研究的项目中看到了类似于webdriver-jvm的事情。在我的项目中我很幸运能够在页面中加载jQuery,因此我在尝试单击按钮之前使用JavascriptExecutor执行$(window).load();
来修复我的问题,这确保了在webdriver继续之前页面已完全加载执行。如果您碰巧加载了jQuery,可以尝试做类似的事情:
browser.driver.executeScript('$(window).load();').then(function() {
var signUpLink = element(by.id('sign-up-link'));
var isLinkClickable = EC.elementToBeClickable(signUpLink);
browser.wait(isLinkClickable, 5000).then(function() {
signUpLink.click();
});
var isWidgetVisible = EC.visibilityOf(element(by.id('email')));
browser.wait(isWidgetVisible, 5000, 'Sign Up Page is too slow');
});