【问题标题】:How to handle JavaScript pop-up window using Selenium and Java?如何使用 Selenium 和 Java 处理 JavaScript 弹出窗口?
【发布时间】:2017-01-08 07:21:08
【问题描述】:

有很多 Stack Overflow 给出了如何处理 JavaScript 窗口的解决方案,但我的情况非常具体。

我正在开发我们的网络基础应用程序的自动化流程。最近开发团队推出了一个 MODAL(这意味着该窗口出现在整个网页的顶部,禁用所有元素定位器)JavaScript 弹出式调查窗口,提示我们的客人是否参加此调查。我并行运行测试(一次两个或三个几十个线程)。对于可以手动与给定页面交互的真实用户,有几种方法可以摆脱窗口:单击“否”按钮,或仅单击页面上的任意位置。我找到了如何使用 Selenium 点击“NO”按钮的方法,其中 driver.findElement(By.xpath("xpathOfNOButton").click

第一个问题是下次我运行测试时,不知道该模态窗口何时会出现在哪个页面上。在某些情况下,模态窗口根本不出现。有时用户可能只是打开主页,窗口马上出现,有时可能需要四到六分钟。没有逻辑。开发团队只解释说这个 JavaScript 模态窗口将为 33% 的网站访问者显示(第三方供应商,无内部控制)。而已。因此,诸如等待一定时间,然后单击“否”按钮的解决方案将不起作用。不存在可以触发此模式窗口弹出的步骤(如在某些其他应用程序上)。

尝试过的解决方案:因为这只发生在我们的 Web 应用程序的生产版本上,所以我为 Firefox 配置文件设置了一个逻辑,一旦它使用 www. URL 启动,它将禁用页面上的所有 JavaScript。但是这个解决方案完全破坏了所有页面,因为许多其他功能都依赖于此。

问题:Java 或 Selenium 中是否有任何方法可以检查给定页面的整个 HTML 结构,以确定该模式弹出脚本是否存在于 HTML 中?

我知道这可能会增加我的测试时间,因为我必须每隔一页检查一次。

第二个问题是:有没有办法在不使用 Selenium WebDriver 指定特定元素的情况下点击页面的空白区域?

如果是,并且模态窗口被捕获,我可以执行此操作以关闭模态窗口。

【问题讨论】:

  • 据我了解,这是一个自定义 js 警报?
  • @NickQ 你好。不是很熟悉自定义和非自定义的 js Alerts,但这是 HTML 结构的那一行对应我的头疼 ips-invite.iperceptions.com/invitations/invitationsJS/125/…">
  • 这个模型窗口是如何创建的?如果这是具有特定名称的 DIV 元素,您可以在页面上查看它们。关于第二个问题,因为这是一个模型窗口,所以它的大小肯定会比页面小,所以只需点击任何距离页面角落可能只有几个像素的地方。
  • @Isiva 是的,该模式窗口存在一个带有 id 的 div。但是它可以在几秒钟内弹出,或者有时可能需要 3-5 分钟才会出现。问题:是否可以先查找此 div,如果找到,以某种方式禁用它,然后才执行任何其他步骤?
  • 看看这里,可能有帮助stackoverflow.com/questions/39145178/…

标签: javascript java html selenium popup


【解决方案1】:

我认为你能做的最好的事情是使用自定义点击方法,它会在点击之前执行另一个方法(例如 checkModal())。 CheckModal 每次都会检查 modal 是否启动,如果是则关闭,否则什么都不做。

如果您可以为模态提供 html,我会编辑答案并提供 java 代码来执行逻辑。

【讨论】:

    【解决方案2】:

    我在我们的网站上遇到了类似的情况。 15 秒后,会弹出一个模式对话框并要求客户注册新闻通讯。问题是,根据脚本的不同,我可能会在 15 秒内到达网站上的任何地方,然后会弹出模式,打乱脚本执行。我做了一些调查,发现弹出模式的功能是检查cookie的存在,如果它不存在,它会弹出模式。这个想法是,如果向客户展示了模态并做出了选择,那么在一段时间内不应再次提示他们。那时,我找到了 cookie 并在开始测试之前创建了它。当脚本第一次到达该站点时,创建模式函数发现 cookie 存在并且从未创建模式。

    我不知道模态在您的网站上是如何工作的,但我猜它可能遵循类似的程序,因此此信息可能对您有所帮助。创建 cookie 非常简单。如果你需要的话,有很多关于 SO 和其他地方的帖子描述了这个过程。很大程度上取决于 cookie 中的信息,但是一旦你弄清楚了,代码就很简单了。

    该过程是导航到您网站上的某些 404 页面,例如http://www.example.com/abcdefg,创建 cookie,然后开始测试。

    【讨论】:

    • 这正是开发团队向我解释的。模态窗口应该寻找一个 cookie,如果其中有任何一个表明用户已经参加了这个调查,模态窗口将不会弹出。
    • 太棒了。所以开发人员可以给你关于 cookie 的信息,你应该能够在脚本开始之前创建一个并完全避免这个问题。
    【解决方案3】:

    我们之前也遇到过类似的问题。页面上随机出现一个广告弹出窗口,因此我们无法单击所需的按钮。因此,我们创建了一个 click 方法,而不是 webDriver.click()。它看起来像;

    public void clickTo(WebElement element) {
        try {
            element.click();
        } catch (WebDriverException ex) {
            logger.warn("WebDriver exception: ", ex);
            webDriver.findElement(By.xpath("//*[@id='xlightBox']//span[@class='closeBtn']")).click();
            element.click();
        }
    

    【讨论】:

    • 当 webdriver 即将执行其他操作(例如从 Dropbox 中选择选项、移动到元素、向文本框输入值等)时,您是如何处理弹出窗口的情况的?
    • @Taylan 我相信只有在点击命令之间出现弹出窗口时它才会很好用。但有时在我的情况下,当用户不执行任何点击时会出现模态 javascript 窗口弹出窗口(数据输入到文本框的情况,用户验证某些元素存在的情况)。
    • @Grasshopper 我们还有其他方法然后 clickTo() 来做基本相同的事情。如果我们想在不使用 element.sendKey() 的文本框中输入内容,我们的框架中有一个 type() 方法和 try catch。顺便说一句,我还没有写出我们正在使用的整个方法。在 catch 内部,有不同类型的弹出窗口的 if 块。但想法是一样的。希望对大家有所帮助。
    • @GordonFreaman 如果使用 selenium 的 javascriptexecutor 从页面 DOM 中删除包含模态窗口的 div 会发生什么?没有 div 没有显示模式窗口,也许....
    • @Grasshopper 问题是我真的不知道这个 javascript 弹出窗口可能会出现在下一次测试迭代的哪些页面上。您的建议是寻找与窗口关联的 div 不起作用。 Selenium 将寻找可能不在特定页面上的 div 并失败。
    【解决方案4】:

    第一个问题亭:

    是的。

    当您执行findElement()findElements() 时,Selenium 将在整个文档中搜索您要查找的内容 找。如果findElement() 没有找到任何东西,则抛出异常, 而findelements() 将返回一个空列表。这样,您可以 在findelements() 中使用一些 cssselector 或 xpath 来检查它是否 存在,如果不存在(返回一个空列表),则跳过模态步骤。

    第二个问题 Awnser:

    是的

    有两种很好的方法可以做到这一点:您可以在页面的点 (1, 1) 上执行单击操作并使用 javascript 隐藏模式 或 selenium 中的 jquery 代码,但如果你有一个模态淡入淡出 当你点击它时隐藏模式,肯定是更好的点击使用 selenium 比 js,只针对 modalfade div 并点击

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-29
      • 2017-04-28
      • 2013-02-03
      • 2013-10-24
      • 1970-01-01
      • 2015-07-09
      • 2021-01-11
      • 1970-01-01
      相关资源
      最近更新 更多