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

如何使用Selenium和Java处理JavaScript弹出窗口?,javascript,java,html,selenium,popup,Javascript,Java,Html,Selenium,Popup,对于如何处理JavaScript窗口,有很多堆栈溢出解决方案,但我的案例非常具体 我正在致力于web应用程序的自动化过程。最近,开发团队启动了一个模式(这意味着窗口出现在整个网页的顶部,禁用了所有元素定位器)JavaScript弹出式调查窗口,提示我们的客户要么接受调查,要么不接受调查。我并行运行测试(一次运行两到三十个线程)。对于可以手动与给定页面交互的真实用户,有几种方法可以摆脱窗口:单击“否”按钮,或者只单击页面上的任意位置。我找到了如何使用Selenium where driver.fi

对于如何处理JavaScript窗口,有很多堆栈溢出解决方案,但我的案例非常具体

我正在致力于web应用程序的自动化过程。最近,开发团队启动了一个模式(这意味着窗口出现在整个网页的顶部,禁用了所有元素定位器)JavaScript弹出式调查窗口,提示我们的客户要么接受调查,要么不接受调查。我并行运行测试(一次运行两到三十个线程)。对于可以手动与给定页面交互的真实用户,有几种方法可以摆脱窗口:单击“否”按钮,或者只单击页面上的任意位置。我找到了如何使用Selenium where driver.findElement(By.xpath(“xpathOfNOButton”)单击“否”按钮的方法

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

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

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

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

第二个问题是:是否有任何方法可以单击页面空白区域而不使用Selenium WebDriver指定特定元素

如果是,并且模式窗口被捕获,我只需执行此操作即可关闭模式窗口。

第一个问题:

是。

当您执行
findElement()
findElements()
时,Selenium将在整个文档中搜索您要搜索的内容 查找。如果
findElement()
未找到任何内容,则引发异常, 相反,
findelements()
将返回一个空列表 在
findelements()
中使用一些cssselector或xpath来检查 存在,如果不存在(返回空列表),请跳过模式步骤

第二个问题是:

有两种很好的方法可以做到这一点:您可以在页面的点(1,1)上执行单击,并使用javascript隐藏模式 或者selenium内部的jquery代码,但是如果您有一个 单击时隐藏模态,当然最好使用 selenium优于js,只针对modalfade div并单击


我们以前也遇到过类似的问题。页面上随机出现了一个广告弹出窗口,因此我们无法单击所需的按钮。因此,我们没有使用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();
    }

我在我们的网站上遇到了类似的情况。15秒后,会弹出一个模式对话框,要求客户注册一份时事通讯。问题是,根据脚本的不同,我可能在15秒内到达网站的任何位置,然后模式会弹出,扰乱脚本的执行。我做了一些调查,发现功能hat弹出模式检查cookie是否存在,如果cookie不存在,它将弹出模式。其想法是,如果客户看到该模式并做出选择,在一定时间内不应再次提示他们。此时,我找到cookie并在开始测试之前创建它。当脚本rst到达站点时,create modal函数看到cookie存在,但从未创建过modal

我不知道模式在你的网站上是如何工作的,但我猜它可能遵循类似的过程,因此这些信息可能会对你有所帮助。创建cookie非常简单。如果你需要的话,在so和其他网站上有很多帖子描述这个过程。很多都取决于cookie中的信息,但代码很简单一旦你弄明白了


这个过程是导航到您站点上的某个404页面,例如创建cookie,然后开始测试。

我认为您可以做的最好的事情是使用自定义单击方法,该方法将执行另一个方法(例如checkModal())单击之前。CheckModal将每次检查模态是否启动,如果启动,则将关闭,否则不执行任何操作


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

据我所知,这是一个自定义js警报?@NickQ Hello。不太熟悉自定义和非自定义js警报,但这是一行html结构,与我的头痛相对应。该模型窗口是如何创建的?如果这是一个DIV元素w使用特定名称,您可以在页面上检查它们。在第二个问题上,由于此isa model窗口的大小肯定小于页面,因此只需单击页面角落中可能只有少量pixcel的任何位置。@Isiva是的,该模式窗口存在id为的div。但它可以在几秒钟内弹出,有时可能需要3-5 mi问题是:是否可以先查找这个div,如果找到,是否可以禁用它