Обработка всплывающих окон браузера с помощью Selenium

Мы проводим регрессионные тесты 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.


person brasskazoo    schedule 19.09.2008    source источник
comment
Что за хрень с этой веткой? Внизу 5 разных людей пытаются его угнать!   -  person ryeguy    schedule 23.10.2009


Ответы (5)


Оно работает!! Просто чтобы облегчить жизнь тем, кто предпочитает селенез.

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

Что за чертовски хлопотно. Спасибо спагетти-монстру в небе за ТАК, иначе я бы не смог заставить это работать в 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>
person branchgabriel    schedule 09.01.2009
comment
Это не работает для меня, если я не перемещаю windowFocus на последнюю введенную команду. Нет никакого смысла в том, чтобы это было до waitForPopUp, не так ли? - person Chris Noe; 29.12.2009

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

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

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

person Josh    schedule 19.09.2008
comment
О, поверьте мне, я бы хотел, чтобы мы могли просто запустить его в Firefox! Но 99% наших пользователей используют IE, так что это приоритет для тестирования... Мы используем *iexplore, а не *iehta. Я не в курсе различий? - person brasskazoo; 19.09.2008
comment
*iehta и *chrome допускают поддержку https. Таким образом, вам не нужно беспокоиться о проблемах, возникающих из-за сертификатов. - person Josh; 19.09.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.

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

person brasskazoo    schedule 19.09.2008
comment
На данный момент это работает, поэтому я собираюсь распространить его на все тесты с помощью всплывающих окон (в конечном итоге мы переходим на лайтбоксы). - person brasskazoo; 09.10.2008

Мне нужно было выбрать iframe во всплывающем окне и заполнить форму. У меня возникли проблемы с использованием команды selectWindow, когда селен не смог найти мой 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>
person nicholasklick    schedule 21.12.2009

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

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

person Peter Bernier    schedule 19.09.2008