t.me/atinfo_chat Telegram группа по автоматизации тестирования

Циклы в Webdriver


(lily) #1

Всем привет! такая беда вот приключилась((

необходимо сделать тест, который будет постить на страницу пользователя сообщения. для такого дела хочу использовать циклы for . написала код, запустила -и... оказалось, что при выполнении цикла первая итерация проходит на ура, а последующие падают. причины вижу две, после ряда попыток реализовать тест: проблема с AJAX или кривые руки :)

вот цикл:

        for ( int i = 0 ; i < 10; i++) {
            try{
                driver.findElement(By.id("reply-message")).clear();
              driver.findElement(By.id("reply-message")).sendKeys("hello word");
                driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
               driver.findElement(By.id("reply-submit")).click();
                driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
                //driver.manage().timeouts().setScriptTimeout(8, TimeUnit.SECONDS);
            
            }
            catch (NoSuchElementException e) {
                driver.findElement(By.id("reply-message")).sendKeys("Error\n");}
        }
        // click | css=ul.links > li > a > span |
        driver.findElement(By.cssSelector("ul.links > li > a > span")).click();

 

пробовала изначально без try-catch. эффект одинаков: первое сообщение постится, а остальные записываются 9 раз в одну строку и не отправляются.

пробовала разные варианты с wait -не помогло. так же были попытки записать driver.findElement(By.id("reply-submit")), как поле  -появилась ошибка вида "Element not found in the cache - perhaps the page has changed since it was looked up"

 может кто сталкивался с подобным....буду рада любой подсказке))

Заранее спасибо)


(Taras) #2

Заче Вам все время вот эти тайм ауты 

driver.manage().timeouts().setScriptTimeout(8, TimeUnit.SECONDS);

???

Здесь по ходу сложного ничего нету.

Попробуйте waiter под этот код если много ajax-a


(Mykhailo Poliarush) #3

это не проблема инструмента, а специфика конкретного приложения

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

об webdriverwait можно посмотреть тут http://automated-testing.info/forum/kak-nayti-vse-elementy-na-stranice-v-konkretnoy-tablice-s-atributom-class-dostup-k-strokam

если есть возможность то приложите пожалуйста код страницы, который вы тестируете


(Shaman) #4

попробуй поставить какое-нибудь условие которое будет проверять выполнение предыдущей итерации(например текст появился на стене), после этого повторяй итерацию, если нет то жди.


(lily) #5

без Timeout или с ними -разницы никакой.

хотелось бы довести до ума при помощи Webdriver.

 


(Taras) #6

ну правильно, я же Вам советую сделать вейтер для вебдрайвера а не такой кривой с задачей времени, плюс у Вас если проходит первая итерация а не проходят остальные то это логично припустить что локация элементов не осуществляеться через эти ваши задержки


(lily) #7

webdriverwait не решил проблемы. наоборот, на нем родном  выдает ошибку java.lang.NullPointerException
  ставила проверки предыдущей интерации - падает на проверке интерации.

впечатление, что после отправки сообщения, страница загружается заново и элементы не находятся((


(Mykhailo Poliarush) #8

значит тогда это специфика вашего приложения

тогда вам надо, как-то нам показать ваше приложения

иначе, я не знаю, какой совет вам дать


(Ivan Bordyug) #9

Привет! Попробуй вот эту функцию добавить

        public IWebDriver Init(IWebDriver driver)
        {
            PageFactory.InitElements(driver, this);
            return driver;
        }

и в самом начале своего кода поставить driver = Init(driver);  Скажи или поможет.

з.ы. using OpenQA.Selenium.Support.PageObjects;


(Vol) #10

Возможно, после того как сообщение было послано - страница обновила локаторы или ваш локатор стал не уникален, т.е driver.findElement(By.id("reply-message")) найдет 2 элемента, и на этом упадет.

lily, попробуйте проинспектировать страницу после добавления сообщения вручную на дупликаты.

 


(lily) #11

спасибо за помощь. попробую сделать. если не получится - придумаю как выложить код страницы...


(lily) #12

пробовала проинспектировать. при помощи FirePath искала дубликаты. находит только одно совпадение с таким id. т.е после обновления страницы локатор остается уникальным. если правильно поняла идею((

строчки  HTML кода, в которой такой id прописан выглядит следующим образом:

<div class="row">

               <div class="f-text">

                 <div class="tr">
                      <div class="bl">
                           <div class="br">
                              <textarea id="reply-message" title="Post" cols="71" rows="6" name="text"/></textarea>
                           </div>
                      </div>
                   </div>
               </div>

  </div>


(lily) #13

не помогло. то же самое вышло. первое сообщение постится, а последующие.... показывает , что фраза вводится ,но кнопка Submit не нажимается....

public WebDriver Init(WebDriver driver)
    {
        PageFactory.initElements(driver, this);
        return driver;
    }

вначале кода добавила строку driver = Init(driver);


(Ivan Bordyug) #14

А может быть попробуй записать две итерации рекордером, а потом глянуть мож какая то разница есть в селекторах или еще в чем то.??


(lily) #15

сделала... идентично все . Причем когда код выглядит вот так:


        driver.findElement(By.id("reply-message")).clear();
        driver.findElement(By.id("reply-message")).sendKeys("try try try");
        driver.findElement(By.id("reply-submit")).click();
       
        driver.findElement(By.id("reply-message")).clear();
        driver.findElement(By.id("reply-message")).sendKeys("try try try try");
        driver.findElement(By.id("reply-submit")).click();

 

первый раз пишет и отправляет все. второй раз пишет и не отправляет

когда же делаю теже самые движения рекордером т.е. в Selenium IDE все проходит на ура! оба раза идут.

мистика


(lily) #16

и да, при прогоне теста в Eclipse с кодом

 driver.findElement(By.id("reply-message")).clear();
        driver.findElement(By.id("reply-message")).sendKeys("try try try");
        driver.findElement(By.id("reply-submit")).click();
       
        driver.findElement(By.id("reply-message")).clear();
        driver.findElement(By.id("reply-message")).sendKeys("try try try try");
        driver.findElement(By.id("reply-submit")).click();

тест не падает. а просто не выполняет дважды отправку.


(Taras) #17

дебагать пробовали чтоб посмотреть где валиться ?


(Vol) #18

Ок, значит смотреть нужно в локатор второго клика.

 

У меня была ситуация, когда c Selenium IDE все проходило на ура, а когда открывался браузер с плагином WebDriver, локатор немножко менял свою позицию или id.

lily, сохраните страницу когда WebDriver не нажимает на кнопочку "reply-submit" и проинспектируйте этот елемент на вшивость :).

 


(lily) #19

пробовали:)

.....

for ( int i = 0 ; i < 10; i++) {
            
                driver.findElement(By.id("reply-message")).clear();
                driver.findElement(By.id("reply-message")).sendKeys("hello word");
                driver.findElement(By.id("reply-submit")).click();
               
        }

        driver.findElement(By.id("content-row")).click();
        driver.findElement(By.linkText("Logout")).click();

....

вот цикл, который должен выполнится. и не выполняется. дебажила. сам тест не падает -идет до конца. но вот 10 сообщений с фразой " hello word " нет. только 1 сообщение.

пошагово дебажить тоже пробовала. .. есть break point на  cтрочке  driver.findElement(By.id("content-row")).click();  в поле ввода написано предыдущее сообщение, а запостило только 1 раз фразу. ничего не отправляется. т.к получается не происходит нажатие на кнопку .id("reply-submit")......

в чем беда?


(lily) #20

;) вшивость показала наличие вот чего по кнопке с id("reply-submit")

страница кода WebDriver :

<div/>

    <input id="reply-submit" class="btn-form reply btn-hover" type="image" title="Reply" alt="Reply" src="/images/btn-reply.gif" disabled="">
</div>
<input type="hidden" value = "rgerkot5rrerer5555" name= "hash">

 

страница кода обычная

<div/>

    <input id="reply-submit" class="btn-form reply btn-hover" type="image" title="Reply" alt="Reply" src="/images/btn-reply.gif">
</div>

 

откуда берется "довесок" в WebDriver не представляю