0

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

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按钮。

4

3 回答 3

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 
于 2018-07-16T14:24:39.063 回答
0

这个窗口是一个modalDialog,不是吗?如果它是一个模态对话框,那么你可以通过 selenium 找到一个元素,但无法获取它的任何属性。

详情:Modal pop-up - 这是 IE 特有的,微软将其定义为

当 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 Toolbar 或 FireBug 捕获属性。

于 2019-09-27T09:07:03.307 回答
0

我认为你很接近。您需要等待新窗口HTML DOM被渲染(您可以等待文本为Yes的按钮可点击),您可以使用以下解决方案:

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 实例是驱动程序(不是浏览器

于 2018-07-16T15:10:33.677 回答