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

时间:2016-08-31 15:52:55

标签: javascript java html selenium popup

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

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

第一个问题是在下次运行测试时,此模式窗口可能出现的页面和页面上没有任何线索。有些情况下模态窗口根本不出现。有时用户可能只是打开主页,窗口立即出现,有时可能需要4到6分钟。没有逻辑。开发团队仅提供了这样的解释:这个JavaScript模式窗口将出现在33%的网站访问者中(第三方供应商,没有内部控制)。而已。因此,等待一定时间的解决方案,然后单击“否”按钮将无法正常工作。没有可以触发此模态窗口弹出的步骤(就像在其他一些应用程序上一样)。

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

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

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

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

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

4 个答案:

答案 0 :(得分:1)

我遇到了与我们网站类似的情况。 15秒后,将弹出模态对话框并要求客户注册简报。问题是,根据脚本,我可以在15s内在网站的任何地方,然后模式将弹出搞乱脚本执行。我做了一些调查,发现弹出模态的函数是检查cookie的存在,然后如果它不存在,它会弹出模态。我们的想法是,如果向客户提供模式并做出选择,则不应再提示他们一段时间。那时,我发现了cookie并在开始测试之前创建了它。当脚本第一次到达站点时,创建模式函数看到cookie存在并且从未创建模式。

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

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

答案 1 :(得分:0)

第一个问题Awnser:

  

是的。

     

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

第二个问题Awnser:

  

即可。

     

有两种好的方法可以做到:你可以在页面的点(1,1)中执行点击,使用javascript隐藏模态   或者selenium中的jquery代码,但是如果你有模态淡入淡出那么   当你点击它时隐藏模态,当然最好点击使用   selenium比js,只针对modalfade div并单击

答案 2 :(得分:0)

We faced a similar problem before. There was an ad popup is coming up randomly on pages and we can't click the buttons we wanted because of that. So instead of webDriver.click(), we made a click method. It was look like;

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();
    }

答案 3 :(得分:0)

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

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