Java WebDriver在特定时间后关闭弹出窗口

Java WebDriver在特定时间后关闭弹出窗口,java,selenium,selenium-webdriver,webdriver,webdriverwait,Java,Selenium,Selenium Webdriver,Webdriver,Webdriverwait,我有一个基于seleniumwebdriver的测试,它填写一个表单并发送给处理。在处理期间,窗口打开。有时处理失败,但此窗口未关闭,因此无法获得结果。本测试的目的是获得结果。我尝试设置此窗口的超时时间,因此它应该在预定义的时间后关闭(我现在将其设置为10秒)。通过WebDriver,表单应该重新发送。我使用以下代码 WebElement webElement; try { driver.manage().timeouts().implicitlyWait(10, TimeUnit.SE

我有一个基于
seleniumwebdriver
的测试,它填写一个表单并发送给处理。在处理期间,窗口打开。有时处理失败,但此窗口未关闭,因此无法获得结果。本测试的目的是获得结果。我尝试设置此窗口的超时时间,因此它应该在预定义的时间后关闭(我现在将其设置为10秒)。通过
WebDriver
,表单应该重新发送。我使用以下代码

WebElement webElement;
try {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    driver.findElement(sendButton).click();
    webElement = wait.until(ExpectedConditions.presenceOfElementLocated(By.className("button-resultdown")));
} catch (TimeoutException ex) {
    webElement = null;
} finally {
    driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
}
if (webElement == null) {
    driver.findElement(popUpClose).click();
    TimeUnit.SECONDS.sleep(4);
    driver.findElement(sendButton).click();
}

弹出窗口在10秒后不会自动关闭。我检查了元素定位器,它们是有效的。

最佳做法是不要同时使用显式和隐式等待,而是查找更多详细信息。
对于popup close,您可以尝试使用JavaScript单击,或者等待
popUpClose
可单击

JavascriptExecutor js = (JavascriptExecutor) driver;

driver.findElement(sendButton).click();

List<WebElement> elements = waitElements(driver, 5, By.className("button-resultdown"));
if (elements.size() == 0){
    List<WebElement> popUpCloseButtons = driver.findElements(popUpClose);
    System.out.println("Popup Close Buttons size: " + popUpCloseButtons.size());
    if (popUpCloseButtons.size() > 0)
        js.executeScript("arguments[0].click();", popUpCloseButtons.get(popUpCloseButtons.size() - 1));
        //popUpCloseButtons.get(popUpCloseButtons.size() - 1).click();
}
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
driver.findElement(sendButton).单击();
List elements=waitElements(driver,5,By.className(“button resultdown”);
if(elements.size()==0){
列出popUpCloseButtons=driver.findElements(popUpClose);
System.out.println(“弹出关闭按钮大小:+popUpCloseButtons.size());
如果(popUpCloseButtons.size()>0)
js.executeScript(“参数[0]。单击();”,popUpCloseButtons.get(popUpCloseButtons.size()-1));
//获取(popUpCloseButtons.size()-1)。单击();
}
和自定义等待方法:

public List<WebElement> waitElements(WebDriver driver, int timeout, By locator) throws InterruptedException {
    List<WebElement> elements = new ArrayList<>();
    for (int i = 0; i < timeout; i++) {
        elements = driver.findElements(locator);
        if (elements.size() > 0)
            break;

        System.out.println("Not!");
        Thread.sleep(1000);
    }

    return elements;
}
公共列表waitElements(WebDriver驱动程序、int timeout、按定位器)引发InterruptedException{
列表元素=新的ArrayList();
for(int i=0;i0)
打破
System.out.println(“不是!”);
睡眠(1000);
}
返回元素;
}

最佳做法是不要同时使用显式和隐式等待,请查找更多详细信息。
对于popup close,您可以尝试使用JavaScript单击,或者等待
popUpClose
可单击

JavascriptExecutor js = (JavascriptExecutor) driver;

driver.findElement(sendButton).click();

List<WebElement> elements = waitElements(driver, 5, By.className("button-resultdown"));
if (elements.size() == 0){
    List<WebElement> popUpCloseButtons = driver.findElements(popUpClose);
    System.out.println("Popup Close Buttons size: " + popUpCloseButtons.size());
    if (popUpCloseButtons.size() > 0)
        js.executeScript("arguments[0].click();", popUpCloseButtons.get(popUpCloseButtons.size() - 1));
        //popUpCloseButtons.get(popUpCloseButtons.size() - 1).click();
}
JavascriptExecutor js=(JavascriptExecutor)驱动程序;
driver.findElement(sendButton).单击();
List elements=waitElements(driver,5,By.className(“button resultdown”);
if(elements.size()==0){
列出popUpCloseButtons=driver.findElements(popUpClose);
System.out.println(“弹出关闭按钮大小:+popUpCloseButtons.size());
如果(popUpCloseButtons.size()>0)
js.executeScript(“参数[0]。单击();”,popUpCloseButtons.get(popUpCloseButtons.size()-1));
//获取(popUpCloseButtons.size()-1)。单击();
}
和自定义等待方法:

public List<WebElement> waitElements(WebDriver driver, int timeout, By locator) throws InterruptedException {
    List<WebElement> elements = new ArrayList<>();
    for (int i = 0; i < timeout; i++) {
        elements = driver.findElements(locator);
        if (elements.size() > 0)
            break;

        System.out.println("Not!");
        Thread.sleep(1000);
    }

    return elements;
}
公共列表waitElements(WebDriver驱动程序、int timeout、按定位器)引发InterruptedException{
列表元素=新的ArrayList();
for(int i=0;i0)
打破
System.out.println(“不是!”);
睡眠(1000);
}
返回元素;
}

谢谢,但当WebDriver关闭窗口时,我如何定义“超时”值?我应该等待预定义的时间,然后单击关闭按钮,然后等待窗口消失。因此,此代码错过了第一步,等待预定义的时间(10秒)。当页面加载时,按钮是可点击的,所以它不是一个良好的状态。您可以在
WebDriverWait wait=new WebDriverWait(驱动程序,10)中设置预定义的时间<代码>如果(elements==null)
如果没有结果,请单击关闭按钮。然后等待,直到您为显式等待设置的预定义时间
invisibilityOfElementLocated
wait。如果你想点击直到弹出窗口关闭,你可以把它放在一个循环中,我也试过你的代码,但它不工作,没有任何效果。我尝试使用
ExpectedConditions。invisibilityOfElementLocated也被设置为
,但我在10秒后得到
TimeoutException
,弹出窗口仍然打开。请检查更新的代码。还要检查DOM中是否有多个popUpClose按钮谢谢,但是我如何定义“超时”值,WebDriver何时应该关闭窗口?我应该等待预定义的时间,然后单击关闭按钮,然后等待窗口消失。因此,此代码错过了第一步,等待预定义的时间(10秒)。当页面加载时,按钮是可点击的,所以它不是一个良好的状态。您可以在
WebDriverWait wait=new WebDriverWait(驱动程序,10)中设置预定义的时间<代码>如果(elements==null)
如果没有结果,请单击关闭按钮。然后等待,直到您为显式等待设置的预定义时间
invisibilityOfElementLocated
wait。如果你想点击直到弹出窗口关闭,你可以把它放在一个循环中,我也试过你的代码,但它不工作,没有任何效果。我尝试使用
ExpectedConditions。invisibilityOfElementLocated也被设置为
,但我在10秒后得到
TimeoutException
,弹出窗口仍然打开。请检查更新的代码。还要检查DOM中是否有多个popUpClose按钮