Перейти к содержимому

defacr

Регистрация: 27 сен 2013
Offline Активность: 15 июл 2016 13:18
-----

Мои сообщения

В теме: Webdriver, ожидание элементов

07 июня 2016 - 15:17

Вот что выходит в случае с протрактором.

Перед обращению к вебэлементам (например перед кликом) я вызываю:

ngDriver.waitForAngular();

 

В итоге клик срабатывает, однако само веб-приложение вылетает с еррором:

Error: Error: [$rootScope:infdig] 10 $digest() iterations reached. Aborting!
Watchers fired in the last 5 iterations: []
http://errors.angularjs.org/1.4.0/$rootScope/infdig?p0=10&p1=%5B%5D
http://wl-ins:27400/main-99aec0a75125b8ad788a2803794e715a-cached.js:2140
window.onerror@http://wl-ins:27400/main-99aec0a75125b8ad788a2803794e715a-cached.js:1277:52

Т.е. при клике на контрол я не перехожу на другую страничку, а вижу ошибку.

 

Полагаю что перед кликом метод waitForAngular передает веб-приложению какие-то запросы, и оно в итоге валится.

Не могу понять каким образом можно этот этап отследить.


В теме: Webdriver, ожидание элементов

06 июня 2016 - 13:08

Слышал о Protractor, но еще не пробовал.

 

Сейчас делаю клик таким способом:

((JavascriptExecutor)driver).executeScript("arguments[0].click();", webElement);

И похоже что всё отлично срабатывает без лишних ожиданий.

Вопрос - на сколько этот способ хорош (или плох) в данном случае?

 

Спасибо.


В теме: Webdriver, ожидание элементов

31 мая 2016 - 15:14

 

Привет! Я сама тоже начинающая, но у меня честно говоря ошибок с таймаутом не возникало, то есть конкретного решения не предложу, но могу подсказать, что я бы проверила:

  • сложилось впечатление, что ты не совсем верно работаешь с локаторами, если приложение на ангуляре, почему не использовать ng-model или прочие локаторы, по которым поиск элементов быстрее xpath?
  • не совсем ясно: инициализируешь ожидание драйвера и потом используешь неявное ожидание для поиска элементов? не может быть путаницы в явнях и неявных ожиданиях? в первом случае ты выставляешь время инициализации экземпляра веб драйвера, а во втором явное ожидание для элементов? может это избыточно?
  • если решил использовать явное ожидание, попробуй использовать ExpectedConditions.presenceOfElementLocated , а не visibilityOfElementLocated
  • использовать sleep - по-моему вообще не выход

Спасибо за тему, в любом случае остаюсь следить.

 

Спасибо за комментарии.

1. Я выполнял поиск по разным видам локаторов. Ошибок с поиском элемента нет. Элемент как раз таки виден. И даже как бы "кликабелен".

2. Это я уже делал в рамках эксперимента, конечно же явные и неявные ожидания одновременно я не использовал.

3. Это тоже пройдено. Все виды ExpectedConditions проверены, на результат это не влияет.

 

Как мне подсказали сообщением выше - проблема с тем, что событие, которое вызывается по клику еще не успело подгрузится скриптами. Пока что выясняю как это можно обойти.

Спасибо вам за внимание.


В теме: Webdriver, ожидание элементов

29 мая 2016 - 16:26

Продолжаю дальше.

Похоже что я некорректно использую ожидание подгрузки элементов.

Выбор любого действия (авторизация, клик по ссылкам, итд) происходит без перезагрузки страницы.

Инициализацию пейджа я выполняю в базовом классе, от которого остальные пейджи наследуются:

public BasePage(WebDriver driver) throws InterruptedException
{
      ElementLocatorFactory page =  new AjaxElementLocatorFactory(driver, configTest.getWaitTime());
      PageFactory.initElements(page, this);
      
      this.driver = driver;
}

Но это не спасает.

После успешной авторизации я попадаю на страничку, на которой пытаюсь кликнуть по span элементу, но клик не выполняется. Визуально видно что тест выбрал нужный спан (он подсветился), однако клик не произошел. Опять таки, если я явно задам sleep хотя бы в 500 мс, то всё отработает нормально.

Никак не могу понять почему страница не может дождаться полной загрузки всех контролов. Каждый раз выставлять слип совсем не хочется.

 

Господа, очень прошу о помощи, ибо не понятно в какую сторону копать.

 

Спасибо большое!


В теме: Webdriver, ожидание элементов

29 мая 2016 - 10:59

У контролов есть плейсхолдеры, и соответственно я попробовал изменить xpath на более явный вид:

//input[@placeholder='Scan or enter User ID']

Процент фейлов значительно уменьшился (примерно 2 фейла из 10 запусков).

Дело в том, что у инпутов нет явных неймов и идентификаторов, чтобы можно было их распознать. Инпут примерно такого содержания:

<input type="password" autocomplete="off" autocorrect="off" autocapitalize="off" maxlength="25"
       ng-model="loginInfo.password" sw-localize-attr="{placeholder: 'password.placeholder'}" 
       class="sw-loginPassword
              sw-input
              sw-input-wrapper
              sw-input-password-wrapper
              sw-input-password
              ng-pristine
              ng-untouched
              ng-valid
              ng-valid-maxlength"
              placeholder="Password">

Пробовал через xpath меняя атрибуты (ng-model, sw-localize-attr) - результат примерно тот же самый как и с плейсхолдером, но всё же это уже намного лучше чем в первоначальном варианте.