【问题标题】:Unable to access content of window with Selenium无法使用 Selenium 访问窗口的内容
【发布时间】:2018-07-16 13:30:03
【问题描述】:

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

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

【问题讨论】:

  • 您是否尝试与新打开的窗口上的任何元素进行交互,因为您提到可以关闭它?
  • 请提供一些HTML源代码。
  • @cruisepandey 是的,我有,它无法在页面中找到任何元素,到目前为止我唯一能做的就是关闭它
  • @Kovacic 的新窗口?
  • @Meryem : 你能分享 URL 或 HTML 或新打开的窗口吗?

标签: selenium selenium-webdriver webdriver webdriverwait


【解决方案1】:

你可以试试这个:

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

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 

【讨论】:

  • 就像其他解决方案一样,它在单击“是”按钮行时会出现java.lang.NullPointerException 错误
  • @Meryem :是否有任何与代码中任何对象的初始化相关的内容。我怀疑这将是问题所在,因为您收到 NullPointer 异常。
  • 我只在尝试与新窗口元素交互时得到 NullPointer,它们都在我发布的代码中
【解决方案2】:

我认为你很接近。您需要等待 新窗口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实例是driver(不是browser

【讨论】:

  • 就像我尝试过的其他答案一样,这给了我一个java.lang.NullPointerException 错误,在我单击“是”按钮的那一行
  • 不,我们没有在 Yes 按钮上尝试任何click()。我们只是在提取页面源之前等待。
  • @Meryem 查看我的更新答案并告诉我结果。
  • 很遗憾,还是出现了 NullPointerException
  • 您能否用您的完整代码块更新问题以进行进一步分析?
【解决方案3】:

这个窗口是一个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 捕获属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 2022-06-10
    • 1970-01-01
    • 2023-01-20
    • 2023-01-13
    • 2023-01-10
    • 2019-12-02
    相关资源
    最近更新 更多