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

24

我想处理rediff.com的登录部分,但是下面的代码无法实现:

driver.get("http://www.rediff.com/");
WebElement sign = driver.findElement(By.xpath("//html/body/div[3]/div[3]/span[4]/span/a"));
sign.click();
String myWindowHandle = driver.getWindowHandle();
driver.switchTo().window(myWindowHandle);
WebElement email_id= driver.findElement(By.xpath("//*[@id='signin_info']/a[1]"));
email_id.sendKeys("hi");

如果myWindowHandle不是正确的字符串,则请告诉我如何获取弹出窗口的名称,因为我无法找到弹出窗口的名称。


使用 driver.getWindowHandles() 获取窗口列表。 - Ripon Al Wasim
10个回答

44

要切换到弹出窗口,您需要使用 getWindowHandles() 并对它们进行迭代。

在您的代码中,您正在使用 getWindowHandle(),这将使您得到父窗口本身。

String parentWindowHandler = driver.getWindowHandle(); // Store your parent window
String subWindowHandler = null;

Set<String> handles = driver.getWindowHandles(); // get all window handles
Iterator<String> iterator = handles.iterator();
while (iterator.hasNext()){
    subWindowHandler = iterator.next();
}
driver.switchTo().window(subWindowHandler); // switch to popup window

// Now you are in the popup window, perform necessary actions here

driver.switchTo().window(parentWindowHandler);  // switch back to parent window

但我只需要处理一个窗口,所以我认为没有必要使用迭代器...你有另一种方法吗?我只需要在rediff.com的登录表单中写入电子邮件地址和密码。请帮助我。 - Niyati
以上代码将处理此问题。一旦您切换到弹出窗口,选择网页元素并填写您的电子邮件地址、密码并提交。然后切换回父窗口。 - LINGS
1
尝试过了,但代码在链接rediff.com上无法运行 -> 点击“登录”链接并尝试登录。 - Niyati
@Johnp2:请不要劫持答案。 - Hovercraft Full Of Eels

11

我找到了解决上述程序的方法,该程序的目标是登录http://rediff.com

public class Handle_popupNAlert
{
    public static void main(String[] args ) throws InterruptedException
    {
        WebDriver driver= new FirefoxDriver(); 
        driver.get("http://www.rediff.com/");
        WebElement sign = driver.findElement(By.xpath("//html/body/div[3]/div[3]/span[4]/span/a"));
        sign.click();

        Set<String> windowId = driver.getWindowHandles();    // get  window id of current window
        Iterator<String> itererator = windowId.iterator();   

        String mainWinID = itererator.next();
        String  newAdwinID = itererator.next();

        driver.switchTo().window(newAdwinID);
        System.out.println(driver.getTitle());
        Thread.sleep(3000);
        driver.close();

        driver.switchTo().window(mainWinID);
        System.out.println(driver.getTitle());
        Thread.sleep(2000);

        WebElement email_id= driver.findElement(By.xpath("//*[@id='c_uname']"));
        email_id.sendKeys("hi");
        Thread.sleep(5000);

        driver.close();
        driver.quit();
    }  
}

5
您可以处理弹出窗口或警告框:
Alert alert = driver.switchTo().alert();
alert.accept();

您还可以拒绝弹出框:

Alert alert = driver.switchTo().alert();
alert().dismiss();

5
当您收到任何网页浏览器弹出的警告框时,可以在您的代码中使用以下代码。
// Accepts (Click on OK) Chrome Alert Browser for RESET button.

Alert alertOK = driver.switchTo().alert();
alertOK.accept();



//Rejects (Click on Cancel) Chrome Browser Alert for RESET button.

Alert alertCancel = driver.switchTo().alert();
alertCancel.dismiss();

当你收到任何网页浏览器弹出的警告框时,你可以在你的代码中使用上述代码。 - Manasis Mishra

2

不要使情况变得复杂。如果可用,请使用ID

driver.get("http://www.rediff.com");
WebElement sign = driver.findElement(By.linkText("Sign in"));
sign.click();
WebElement email_id= driver.findElement(By.id("c_uname"));
email_id.sendKeys("hi");

我无法直接使用email_id字段,因为它在弹出窗口中。请访问rediff.com,因为我想在rediff.com的登录表单中输入电子邮件地址和密码。链接:http://www.rediff.com/ - Niyati
你使用的是哪个浏览器?因为我在点击登录后没有看到任何弹出窗口。它只是另一个模态窗口(在主窗口内)。我正在使用Firefox23。 - HemChe
是的,我需要访问那个并且已经登录。 - Niyati
点击“登录”链接时,您遇到了什么错误?有任何权限错误吗? - HemChe
没有收到任何错误信息,但无法处理电子邮件地址字段。 - Niyati
你是否遇到了“没有这样的元素”异常? - HemChe

0
String parentWindowHandler = driver.getWindowHandle(); // Store your parent window
String subWindowHandler = null;

Set<String> handles = driver.getWindowHandles(); // get all window handles
Iterator<String> iterator = handles.iterator();

subWindowHandler = iterator.next();

driver.switchTo().window(subWindowHandler); // switch to popup window

// Now you are in the popup window, perform necessary actions here

driver.switchTo().window(parentWindowHandler);  // switch back to parent window

0

当 toastr 消息在火狐浏览器屏幕上弹出时,下面的标签会在 Firebug 中显示。

<div class="toast-message">Invalid Credentials, Please check Password</div>.

我当时拍了截图。 然后在Selenium Java代码中进行了以下更改。

String alertText = "";
WebDriverWait wait = new WebDriverWait(driver, 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("toast-message")));
WebElement toast1 = driver.findElement(By.className("toast-message"));  
alertText = toast1.getText();
System.out.println( alertText);

我的toastr弹出问题已经解决。


0
这不是Java,但如果比较有帮助的话,这里有一个简单的Python解决方案在Chrome中处理这个问题只需要一行代码。
from selenium import webdriver

driver = webdriver.Chrome()
driver.get(url)

# Save a list of all open window handles
window_handles = driver.window_handles

# Open new window with click() action - modify as needed.
get_element(driver, By.XPATH, "//input[@title]").click()

# Get and switch to the pop-up window
new_popup_window = list(set(driver.window_handles) - set(window_handles))[0]
driver.switch_to.window(new_popup_window)

1
你的回答可以通过提供更多的支持性信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的回答是否正确。你可以在帮助中心找到有关如何撰写好回答的更多信息。 - undefined

-1
public void Test(){

     WebElement sign = fc.findElement(By.xpath(".//*[@id='login-scroll']/a"));
        sign.click();
        WebElement LoginAsGuest=fc.findElement(By.xpath(".//*[@id='guest-login-option']"));
        LoginAsGuest.click();
        WebElement email_id= fc.findElement(By.xpath(".//*[@id='guestemail']"));
        email_id.sendKeys("ankushdeoladore@gmail.com");
        WebElement ContinueButton=fc.findElement(By.xpath(".//*[@id='contibutton']"));
        ContinueButton.click();

}

-1
       //get the main handle and remove it
       //whatever remains is the child pop up window handle

       String mainHandle = driver.getWindowHandle();
       Set<String> allHandles = driver.getWindowHandles();
       Iterator<String> iter = allHandles.iterator();
       allHandles.remove(mainHandle);
       String childHandle=iter.next();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接