【问题标题】:How to handle external popup using selenium如何使用 selenium 处理外部弹出窗口
【发布时间】:2017-09-06 06:02:46
【问题描述】:

在我的项目中,有一个广告提供商向我们展示弹出广告,但问题是这个弹出窗口会出现它不固定。有时添加不显示有时会在 1 分钟后弹出这个并中断我的测试用例。

我编写了关闭此弹出窗口的代码,但我认为这不是一个完美的解决方案..如果有人可以提供帮助?

boolean Imclose = wd.findElement(By.xpath(".//*[@class='IM_overlay_close_container IM_overlay_close_button']")).isDisplayed();
    if (Imclose == true) {
        wd.findElement(By.xpath(".//*[@class='IM_overlay_close_container IM_overlay_close_button']")).click();
    }

【问题讨论】:

  • 使用警报界面
  • 你能给我举个例子吗?
  • 这个网站是公开的吗,这样我就可以准确地了解您正在处理的内容,并且更容易为您提供帮助。我假设,弹出窗口毕竟可能不是警报,而是 iframe/modal。
  • 你是对的,它不是警报。请去 www.rentbyowner.com/usa 你可以在这里查看..
  • 这是一个弹出广告,您必须等待然后点击关闭或 X

标签: selenium selenium-webdriver selenium-chromedriver


【解决方案1】:

试试这些代码来处理不需要的弹出页面。我提供了 180 秒的等待时间。然后点击广告弹出页面内的关闭按钮。

点击广告弹出页面后,另一个窗口正在打开,所以我必须重定向到我的主窗口,然后才会执行更多代码。

driver.get("https://www.rentbyowner.com/usa");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);

    try
    {           
            WebDriverWait wait = new WebDriverWait(driver, 180);
            wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//div[contains(@class,'IM_overlay_foreground')]"))));
            driver.findElement(By.xpath("//div[contains(@class,'IM_overlay_foreground')]//span[@class='IM_close_text']")).click();


            try
            {
                String winHandleBefore = driver.getWindowHandle();
                for(String winHandle : driver.getWindowHandles())
                {
                    driver.switchTo().window(winHandle);
                    //driver.switchTo().window(winHandle).close();
                }
                driver.switchTo().window(winHandleBefore);

                //Verify purpose written code, weather my driver is getting move to parent window or not.

                WebDriverWait element = new WebDriverWait(driver, 10);
                element.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("top_k_search"))));
                driver.findElement(By.id("top_k_search")).clear();
                System.out.println("Try block");
            }
             catch(Exception a)
            {
                 System.out.println("Inner Catch");
            }
        }
        catch(Exception e)
        {
            System.out.println("Element not present");
            //Provide your code here..
        }

【讨论】:

  • 单击“关闭”按钮时,新窗口的句柄不会切换到。焦点完全在父/主窗口。 但是,如果您想关闭新/子窗口,您将使用上面的代码来切换和关闭它。但是,关闭弹窗的主要目的已经在外层try-catch block的前3行代码中处理好了。
  • 感谢您的评论。但不知何故弹出页面没有关闭,所以我尝试了这个解决方案。
  • 告诉你什么,在单击关闭按钮之前在执行上放置一个断点。现在,手动单击关闭按钮;你会注意到按钮被点击,弹出窗口被关闭,新窗口同时被打开。 :) 注意- 顺便说一下,弹出窗口和新窗口是独立的实体。
  • 如果对您有用,请将此答案标记为Accepted
【解决方案2】:

我观察到这是网页上的正常弹出式覆盖,而不是警报,它几乎在 60 秒内出现。所以,下面的代码可能对你有用。

//Waiting for the Popup to appear
WebDriverWait wait = new WebDriverWait(driver,60);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[contains(@class,'IM_overlay_foreground')]")));

//Clicking on the 'Close' text to close the popup.
driver.findElement(By.xpath("//div[contains(@class,'IM_overlay_foreground')]//span[@class='IM_close_text']")).click();

注意:您可以将时间从 60 增加到 90,以防看起来需要更长的时间。问题是,只要在设置的时间范围内出现弹出窗口,就会对其进行处理(如已关闭)。

【讨论】:

  • 我已经尝试过你的代码,但是关闭弹出页面不起作用,我还提供了等待 180 秒,然后显示弹出页面,但是当我尝试单击关闭时按钮或文本,它只是打开另一个浏览器窗口。
  • @Jainish,感谢您的检查和分析。我当时没有资源来查看这一点。:) 当单击“关闭”按钮时,它实际上会关闭弹出窗口并同时打开一个新窗口。上面的代码行实际上与 OP 所要求的相同。关闭新窗口只是一种选择。请在答案的 cmets 部分找到进一步的说明。
【解决方案3】:

实际上它会在 30-50 秒后出现,所以你必须等待然后点击关闭按钮。

System.setProperty("webdriver.chrome.driver", "E:\\software and tools\\chromedriver_win32\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.rentbyowner.com/usa");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
WebElement ad=driver.findElement(By.xpath(".//*[@id='IM_target_overlay']/div/div/div/div[1]/a/div"));
WebDriverWait wait= new WebDriverWait(driver, 30);
wait.until(ExpectedConditions.visibilityOf(ad));
ad.click();

更多信息请参考此链接:

Handling Alerts in Selenium Webdriver

【讨论】:

  • 我试过你的代码,但是关闭弹出页面不起作用,我还提供了等待180秒,然后弹出页面显示,但是当我尝试点击在关闭按钮或文本上,它只是打开另一个浏览器窗口。
  • 请提供解决方案,因为它在我的电脑上工作
猜你喜欢
  • 2013-02-03
  • 1970-01-01
  • 2015-07-09
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-11
  • 1970-01-01
相关资源
最近更新 更多