无法使用Selenium访问窗口的内容

时间:2018-07-16 13:30:04

标签: selenium selenium-webdriver webdriver webdriverwait pagesource

我必须单击一个打开窗口的按钮,我想像这样检索该窗口的内容:

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();

我不知道自己在做什么,我无法操作窗口中的元素,因为我无法访问它。

编辑:

新窗口的网址:https://thatwebsite.fr/com.sap.portal.navigation.masthead.logoffConfirmMsg

新窗口中的HTML:

<table datatable="0" border="0" cellspacing="5" cellpadding="0">
    <tbody>
        <tr>
            <td class="ctrlMsgBarImgWarning">&nbsp;</td>
            <td class="ctrlTxtStd">Are you sure you want to log off?</td>
        </tr>
        <tr>
            <td colspan="2" height="10">&nbsp;</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按钮。

3 个答案:

答案 0 :(得分:0)

您可以尝试以下方法:

点击首页上的按钮/链接后:

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 

答案 1 :(得分:0)

我认为您已经很接近了。您需要等待新窗口HTML DOM呈现(您可以等待文本为的按钮可点击< / em>),则可以使用以下解决方案:

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());
    }
}

注意:确保此解决方案中的Webdriver实例是 driver (不是 browser

答案 2 :(得分:0)

此窗口是一个modalDialog,不是吗?如果是模式对话框,则可以通过硒找到元素,但无法获取其任何属性。

有关详细信息: 模态弹出窗口-这非常特定于IE,Microsoft将其定义为

当Windows Internet Explorer通过使用showModalDialog方法或使用showModelessDialog方法从模式或无模式HTML对话框中打开窗口时,Internet Explorer使用组件对象模型(COM)创建该窗口的新实例。通常,使用现有Internet Explorer进程的第一个实例打开窗口。当Internet Explorer在新过程中打开窗口时,所有的内存cookie都将不再可用,包括会话ID。此过程与Internet Explorer使用open方法打开新窗口的过程不同。 http://msdn.microsoft.com/en-us/library/ms536759(VS.85).aspx

“模态”对话框上的MSDN博客

当用户选择“模型”弹出窗口时,父窗口将被阻止,等待弹出窗口中的返回值。您将无法看到页面的视图源,需要关闭弹出窗口,然后才能激活父窗口。

如何获取模型弹出窗口的对象属性?复制弹出URL,并在新的TAB中打开,然后它将以正常的窗口格式显示,您可以在其中使用IE Dev工具栏或FireBug捕获属性。