Java 使用selenium处理弹出窗口

Java 使用selenium处理弹出窗口,java,selenium,popup,selenium-webdriver,Java,Selenium,Popup,Selenium Webdriver,我有一种情况,点击链接网页会打开一个弹出窗口。弹出窗口打开后,焦点在弹出窗口中,主窗口被禁用。我无法将控件转移到弹出窗口。 请看一下下面的代码 driver.findElement(By.linkText("Click me")).click();// when this line of code is reached then a popup window opens. System.out.println("After Clicking me"); // After the popup w

我有一种情况,点击链接网页会打开一个弹出窗口。弹出窗口打开后,焦点在弹出窗口中,主窗口被禁用。我无法将控件转移到弹出窗口。 请看一下下面的代码

driver.findElement(By.linkText("Click me")).click();// when this line of code is reached then a popup window opens.

System.out.println("After Clicking me"); // After the popup window opens this line of code is never executed.
我无法将控件从父窗口转移到弹出窗口。我知道下面的命令

driver.switchTo().window("popup window");

但这帮不了什么忙。请帮助我。

这是我在需要处理以下弹出窗口时使用的代码,请关闭它并返回主窗口。当然,为了回答这个问题,它被简化了。它保留了原始窗口(主窗口)的句柄,因此可以在其他窗口之间进行区分

它需要一个显式的WebDriverWait,因为我在开发过程中遇到问题,代码在窗口实际打开之前运行,所以这可能不是一个理想的情况

函数操纵程序(最终WebDriver驱动程序,最终WebDriver驱动程序等待){
最后一个字符串mainWindowHandle=driver.getWindowHandle();
driver.findElement(By.id(“linkthatpopenspopup”)。单击();
等待.直到(新的ExpectedConditions(){
@凌驾
公共布尔应用(WebDriver d){
返回值(d.getWindowHandles().size()!=1);
}
});
对于(字符串activeHandle:driver.getWindowHandles()){
如果(!activeHandle.equals(mainWindowHandle)){
driver.switchTo()窗口(activeHandle);
}
}
driver.close();
driver.switchTo().window(mainWindowHandle);
}
driver.findElement(By.linkText(“单击我”)).Click();//当到达这一行代码时,将打开一个弹出窗口

System.out.println(“单击我之后”);//在弹出窗口之后 打开此行代码,但该行代码从未执行

该行代码永远不会执行,因为进程正在等待处理弹出窗口

getWindowHandles()在这种情况下正常工作

例如:

//handle of the master window before clicking the link
String master = driver.getWindowHandle();

driver.findElement(By.linkText("Click me")).click();

//logic for waiting for the popup, checking the size to become greater than 1 or breaking after sometime to avoid the infinite loop.
int timeCount = 1;

do
{
   driver.getWindowHandles();
   Thread.sleep(200);
   timeCount++;
   if ( timeCount > 50 ) 
   {
       break;
   }
}
while ( driver.getWindowHandles().size == 1 );

//Assigning the handles to a set
Set<String> handles = driver.getWindowHandles();
//Switching to the popup window.
for ( String handle : handles )
{
    if(!handle.equals(master))
    {
         driver.switchTo().window(handle);
    }
}
//单击链接前主窗口的句柄
String master=driver.getWindowHandle();
driver.findElement(By.linkText(“单击我”)).Click();
//等待弹出窗口的逻辑,检查大小是否大于1,或在一段时间后中断,以避免无限循环。
int timeCount=1;
做
{
getWindowHandles();
睡眠(200);
timeCount++;
如果(时间计数>50)
{
打破
}
}
while(driver.getWindowHandles().size==1);
//将句柄指定给集合
Set handles=driver.getWindowHandles();
//切换到弹出窗口。
for(字符串句柄:句柄)
{
如果(!handle.equals(master))
{
driver.switchTo().窗口(手柄);
}
}

现在,驱动程序切换到弹出窗口。如果弹出窗口有一个框架,那么在识别其中的元素之前,您需要切换到该框架

你能解释一下wait.until方法的语法和其中的逻辑吗?顺便说一句,driver.getWindowHandles()返回一个集合而不是一个列表。等待基本上一直循环,直到驱动程序有多个句柄,这意味着给我一个适当的时间来确保弹出窗口现在已经准备好与之交互。这是一个很好的方式来确保一旦它进入for()时,它将循环,直到找到一个不是我的主窗口为止。+1。只是一些输入错误:它应该是新的ExpectedCondition(单数)。上面的注释是正确的,我使用了(Iterator it=driver.getWindowHandles().Iterator();it.hasNext();){…}。
public class socialSignOn extends masterBaseClassNewSiteStage {

    @Test
    public void testSocialSignOn() throws Throwable {
        openParticularUrl("/my-lfc/join/user-details?user_type=free");

        driver.findElement(By.cssSelector("#socialSignOn > div.left.socialLogin.googleButton")).click();

        String MainWindow = driver.getWindowHandle();

        for (String activeHandle : driver.getWindowHandles()) {
            if (!activeHandle.equals(MainWindow)) {
                driver.switchTo().window(activeHandle);
            }
        }
        driver.findElement(By.cssSelector("#Email")).sendKeys("");
        driver.findElement(By.cssSelector("#next")).click();
        pauseFiveSeconds();
        driver.findElement(By.cssSelector("#Passwd")).sendKeys("");
        driver.findElement(By.cssSelector("#signIn")).click();
        pauseOneSecond();
        driver.switchTo().window(MainWindow);
        pauseTenSeconds();
        closeDriver();
    }
}
// delay : max number of seconds
new WebDriverWait(driver, delay * 1000).until(ExpectedConditions.alertIsPresent());
drive`enter code here`r.switchTo().alert().accept();