Невозможно получить доступ к содержимому окна с помощью Selenium
Я должен нажать на кнопку, которая открывает окно, и я хочу получить содержимое этого окна следующим образом:
String master = browser.getWindowHandle();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@title=\"Quitter la session du portail actuelle et fermer la session\"]"))).click();
wait.until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> handles = browser.getWindowHandles();
for ( String handle : handles ) {
if(!handle.equals(master)) {
browser.switchTo().window(handle);
}
}
System.out.println(browser.getPageSource());
Окно открывается правильно при щелчке, однако вывод консоли выглядит так:
null
Я могу сказать, что могу указать на окно, потому что закрытие его работает:
String master = browser.getWindowHandle();
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@title=\"Quitter la session du portail actuelle et fermer la session\"]"))).click();
wait.until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> handles = browser.getWindowHandles();
for ( String handle : handles ) {
if(!handle.equals(master)) {
browser.switchTo().window(handle);
}
}
browser.close();
Я не могу сказать, что я делаю неправильно, я не могу манипулировать элементами внутри окна, так как не могу получить к нему доступ.
Редактировать:
URL нового окна: https://thatwebsite.fr/com.sap.portal.navigation.masthead.logoffConfirmMsg
HTML из нового окна:
<table datatable="0" border="0" cellspacing="5" cellpadding="0">
<tbody>
<tr>
<td class="ctrlMsgBarImgWarning"> </td>
<td class="ctrlTxtStd">Are you sure you want to log off?</td>
</tr>
<tr>
<td colspan="2" height="10"> </td>
</tr>
<tr>
<td align="left" nowrap="" colspan="2">
<a id="htmlb_465_htmlb_162_1" ct="B" title="Yes" st="" href="javascript:void(0);" ti="0" tabindex="0" class="urBtnStd" usedclasses="urBtnStdDsbl urBtnStdD urBtnStdDDsbl" ocl="if (htmlbButton_checkClick('htmlb_465_htmlb_162_1', event)) {return htmlbDoEvent(this,'C','onclick','0','htmlb_465_htmlb_162',1,1,'',0);}" onkeydown="return ur_Button_keypress(event)" onclick="return ur_Button_click(event);" style="text-align:center;overflow:visible;">Yes</a>
<a id="htmlb_465_htmlb_162_2" ct="B" title="No" st="" href="javascript:void(0);" ti="0" tabindex="0" class="urBtnStd" usedclasses="urBtnStdDsbl urBtnStdD urBtnStdDDsbl" ocl="if (htmlbButton_checkClick('htmlb_465_htmlb_162_2', event)) {return htmlbDoEvent(this,'C','onclick','0','htmlb_465_htmlb_162',2,1,'',0);}" onkeydown="return ur_Button_keypress(event)" onclick="return ur_Button_click(event);" style="text-align:center;overflow:visible;">No</a>
</td>
</tr>
</tbody>
</table>
Что я в основном пытаюсь сделать, это нажать на Yes
кнопка.
2 ответа
Вы можете попробовать это:
После нажатия на кнопку / ссылки на первой странице:
ArrayList<String> windows = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(windows.get(1));
new WebDriverWait(driver,20).until(ExpectedConditions.elementToBeClickable(By.linkText("Yes"))).click()
driver.close();
driver.switchTo().window(windows.get(0)); //This is switch to windows where you left off
Я думаю, что вы были довольно близки. Вам нужно подождать, пока HTML DOM нового окна будет отображен (вы можете подождать, пока кнопка с текстом " Да" станет кликабельной), и вы можете использовать следующее решение:
String master = driver.getWindowHandle();
new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@title=\"Quitter la session du portail actuelle et fermer la session\"]"))).click();
new WebDriverWait(driver, 20).until(ExpectedConditions.numberOfWindowsToBe(2));
Set<String> handles = driver.getWindowHandles();
for ( String handle : handles ) {
if(!handle.equals(master)) {
driver.switchTo().window(handle);
new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.xpath("//a[@class='urBtnStd' and starts-with(@id,'htmlb_')][contains(.,'Yes')]")));
System.out.println(driver.getPageSource());
}
}
Примечание. Убедитесь, что экземпляр веб-драйвера в этом решении является драйвером (а не браузером).
Это окно является модальным диалогом, не так ли? Если это модальный диалог, вы можете найти элемент по селену, но не можете получить его атрибуты.
Подробнее: модальное всплывающее окно - это очень специфично для IE, Microsoft определила его как
Когда Windows Internet Explorer открывает окно из модального или немодального диалогового окна HTML с помощью метода showModalDialog или с помощью метода showModelessDialog, Internet Explorer использует объектную модель компонентов (COM) для создания нового экземпляра окна. Обычно окно открывается с помощью первого экземпляра существующего процесса Internet Explorer. Когда Internet Explorer открывает окно в новом процессе, все файлы cookie памяти больше не доступны, включая идентификатор сеанса. Этот процесс отличается от процесса, который Internet Explorer использует для открытия нового окна с помощью метода open.http://msdn.microsoft.com/en-us/library/ms536759(VS.85).aspx
Блог MSDN о модальном диалоге
Когда пользователь выбирает всплывающее окно "Модель", родительское окно блокируется в ожидании возвращаемого значения из всплывающего окна. Вы не сможете увидеть источник просмотра страницы, необходимо закрыть всплывающее окно, тогда будет активировано только родительское окно.
Как получить свойства объекта модели-всплывающего окна? Скопируйте URL-адрес всплывающего окна и откройте в новой вкладке, тогда он будет отображаться в обычном формате окна, где вы можете использовать IE Dev Toolbar или FireBug для захвата свойств.