2015-05-07 2 views
1

Я пытаюсь использовать Protractor для нашего приложения. К сожалению, начальная страница входа не является Угловой, поэтому мне приходится обрабатывать все неявные ожидания с помощью ExpectedConditions. В приведенном ниже фрагменте кода функция click() никогда не выполняется. Вместо этого, время тестирования заканчивается, ожидая появления следующей страницы. На выход консоли (также вставленный ниже) я вижу, что ссылка найдена, но я не вижу последующего действия щелчка.Тогда не выполняется после браузера.wait

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] 

Edit - 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

Установили ли вы 'browser.ignoreSynchronization = true;'? – alecxe

+0

Да, у меня есть тот, который установлен в beforeEach в спецификации. Я новичок в transractor/webdriverjs, и мне интересно, делаю ли я что-то, что испортит поток управления. – ryasui

+0

Я просто попытался добавить browser.pause() в анонимную функцию прямо перед кликом(), и выполнение теста не приостанавливается. Таким образом, похоже, что then() никогда не выполняется. – ryasui

ответ

0

Мое лучшее предположение, основанное на том, что вы разделили, заключается в том, что ссылка становится интерактивной, а элементы, находящиеся над ней в DOM, все еще отображаются. Конечным результатом является то, что условие ожидания выполнено, событие клика запланировано, но до того, как щелчок может появиться, появятся новые элементы, которые сдвигают ссылку в другом месте, так что клик фактически не попадает в ссылку. Это звучит надуманно, я знаю, но я видел что-то подобное с webdriver-jvm в проекте, над которым я работал. В моем проекте мне посчастливилось загрузить jQuery на страницу, поэтому я исправил свою проблему, выполнив $(window).load(); с помощью JavascriptExecutor, прежде чем пытаться нажать кнопку, что обеспечило полную загрузку страницы до того, как 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'); 
}); 
Смежные вопросы