如何使用Selenium和Java处理JavaScript弹出窗口

How to handle JavaScript pop-up window using Selenium and Java?

本文关键字:JavaScript 窗口 处理 Java 何使用 Selenium      更新时间:2023-09-26

有很多堆栈溢出给出的解决方案如何处理JavaScript窗口,但我的情况是非常具体的。

我正在研究我们的web基础应用程序的自动化过程。最近开发团队推出了一个MODAL(这意味着窗口出现在整个网页的顶部,禁用所有元素定位器)JavaScript弹出式调查窗口,提示我们的客人是否接受这个调查。我并行地运行我的测试(一次运行两个或三个线程)。对于真正的用户,可以手动与给定的页面进行交互,有几个选项如何摆脱窗口:要么点击"NO"按钮,或者只是点击页面上的任何地方。我找到了如何使用Selenium单击"NO"按钮的方法,其中driver.findElement(By.xpath(" xpathfnobutton ").click

第一个问题是:没有线索何时以及在什么页面上这个模态窗口可能出现任何下次我运行测试。有些情况下,模态窗口根本不出现。有时用户可能只是打开主页,窗口立即出现,有时可能需要4到6分钟。没有逻辑。开发团队只提供了一个解释,这个JavaScript模态窗口将出现在33%的网站访问者(第三方供应商,没有内部控制)。就是这样。所以像等待一段时间,然后点击"NO"按钮这样的解决方案是行不通的。不存在可以触发此模态窗口弹出的步骤(像其他一些应用程序一样)。

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

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

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

第二个问题是 :有没有办法点击页面的空白区域,而不指定特定元素与Selenium WebDriver?

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

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

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

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

第一个问题芒:

是的。

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

第二个问题:

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

我们以前也遇到过类似的问题。有一个广告弹出页面随机出现,我们不能点击我们想要的按钮,因为它。因此,我们创建了一个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();
    }

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

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