Обработка всплывающих окон браузера с помощью Selenium - PullRequest
20 голосов
/ 19 сентября 2008

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

В настоящее время мы используем команды в тесте:

// force new window to open at this point - so we can select it later
selenium().getEval("this.browserbot.getCurrentWindow().open('', 'enquiryPopup')");
selenium().click("//input[@value='Submit']");
selenium().waitForPopUp("enquiryPopup", getWaitTime());
selenium().selectWindow("enquiryPopup");

... который работает большую часть времени . Время от времени тест завершается неудачей на линии waitForPopUp() с

com.thoughtworks.selenium.SeleniumException: Permission denied

Кто-нибудь может предложить лучший, более надежный метод ?

Кроме того, мы в основном запускаем эти тесты на IE6 и 7.

Ответы [ 5 ]

3 голосов
/ 09 января 2009

Работает !! Просто чтобы было легче людям, которые предпочитают селен.

Это сработало для меня, используя IE7 (обычный режим).

Что за чертовски хлопотно. Спасибо спагетти-монстру в небе за SO, иначе у меня не получилось бы, чтобы это работало в IE.

<tr>
    <td>getEval</td>
    <td>selenium.browserbot.getCurrentWindow().open('', 'windowName');</td>
    <td></td>
</tr>
<tr>
    <td>click</td>
    <td>buttonName</td>
    <td></td>
</tr>
<tr>
    <td>windowFocus</td>
    <td>windowName</td>
    <td></td>
</tr>
<tr>
    <td>waitForPopUp</td>
    <td>windowName</td>
    <td>3000</td>
</tr>
<tr>
    <td>selectWindow</td>
    <td>windowName</td>
    <td></td>
</tr>
1 голос
/ 19 сентября 2008

Если вы работаете в режиме * iehta, то тут и там вы столкнетесь с некоторыми глюками. Мы запускаем Selenium на моей работе, и, похоже, у меня много проблем с IE и AJAX.

Тем не менее, похоже, что проблема, с которой вы сталкиваетесь, заключается в том, что Selenium пытается получить доступ к компоненту в другом окне, прежде чем он полностью загрузится. Я не уверен, какой диапазон времени ожидания по умолчанию установлен, но вы можете попробовать увеличить его до 60 (60000 мс) секунд или около того, чтобы обойти проблему.

Кроме того, я бы предложил запустить ваши тесты в Firefox (используя * chrome), поскольку он дает гораздо более надежные результаты, но иногда это просто невозможно из-за требований бизнеса.

0 голосов
/ 21 декабря 2009

Мне нужно было выбрать iframe во всплывающем окне и заполнить форму. У меня возникли проблемы с использованием команды selectWindow, где selenium не удалось найти мой iframe, поэтому я удалил команду.

Этот selenese работал хорошо для меня (где заголовок iframe и id = account_frame):

<tr>
  <td>click</td>
  <td>//a[@class='item_add']</td>
  <td></td>
</tr>
<tr>
  <td>windowFocus</td>
  <td>account_frame</td>
  <td></td>
</tr>
<tr>
  <td>waitForPopUp</td>
  <td>account_frame</td>
  <td>10000</td>
</tr>
0 голосов
/ 19 сентября 2008

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

У меня раньше были такие же ошибки, и я смог надежно разрешить их, только сделав вызовы System.Threading.Thread.Sleep (5000).

0 голосов
/ 19 сентября 2008

Я только что попробовал добавить еще одну функцию селена, windowFocus():

// force new window to open at this point - so we can select it later
selenium().getEval("this.browserbot.getCurrentWindow().open('', 'enquiryPopup')");
selenium().click("//input[@value='Submit']");
selenium().windowFocus("enquiryPopup");
selenium().waitForPopUp("enquiryPopup", getWaitTime());
selenium().selectWindow("enquiryPopup");

Тест прошел успешно, когда я запустил его локально, но только со всеми этими вызовами методов - create / focus / wait / select.

Я собираюсь позволить серверу сборки запускать все тесты, и если это тоже удастся, я сделаю из него библиотечную функцию ...!

...