Обработка всплывающих окон браузера с помощью Selenium
-
01-07-2019 - |
Вопрос
Мы проводим регрессионные тесты 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.
Решение
Оно работает!!Просто чтобы облегчить задачу людям, которые предпочитают селенезе.
Это сработало для меня, используя 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>
Другие советы
Если вы работаете в режиме *iehta, то тут и там вы столкнетесь с некоторыми сбоями.На моей работе мы используем Selenium, и, похоже, у меня много проблем с IE и AJAX.
Однако похоже, что проблема, с которой вы столкнулись, заключается в том, что Selenium пытается получить доступ к компоненту в другом окне до его полной загрузки.Я не уверен, какой у вас установлен диапазон тайм-аута по умолчанию, но вы можете попробовать увеличить его до 60 (60 000 мс) секунд или около того, чтобы решить проблему.
Помимо этого, я бы предложил проводить тесты в Firefox (с использованием *chrome), поскольку это дает гораздо более надежные результаты, но иногда это просто невозможно из-за бизнес-требований.
Я только что попробовал добавить еще одну функцию селена, 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.
Я собираюсь позволить серверу сборки выполнить все тесты, и если это тоже удастся, я сделаю из этого библиотечную функцию...!
Мне нужно было выбрать iframe во всплывающем окне и заполнить форму.У меня возникли проблемы с использованием cmd selectWindow, из-за которого селен не смог найти мой iframe, поэтому я удалил команду.
Этот селенез мне подошел (где заголовок 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>
Попробуйте добавить несколько операторов ожидания вокруг вызовов, которые вызывают у вас проблемы.
Раньше у меня были такие же ошибки, и единственный способ, которым я смог надежно разрешить их можно, вызвав System.Threading.Thread.Sleep(5000)..