Selenium 简明教程
Selenium WebDriver - Multi Windows Testing
Selenium WebDriver 可用于处理多窗口测试。所有启动的窗口都通过会话的唯一标识符进行识别。随着另一个窗口的打开,驱动程序的上下文继续保留在父窗口。要在子窗口上执行任务,需要将驱动程序的上下文从父窗口转移到子窗口。
Basic Methods to Handle Multiple Windows in Selenium
Selenium 中有各种方法可用于自动化处理多个窗口的测试。要处理子窗口,需要将驱动程序上下文从父窗口转移到子窗口 windows 。
Example 1
在下面的页面中,单击 New Tab 。
在单击 New Tab 后,我们将转到带有文本 New Tab 的另一个选项卡。
Code Implementation
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class TabsHandling {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new EdgeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// Opening the webpage with new tab
driver.get("https://www.tutorialspoint.com/selenium/practice/browser-windows.php");
// click link then navigate to next tab
WebElement b = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/button[1]"));
b.click();
// Get original window handle id
String oW = driver.getWindowHandle();
// get every windows handle ids
Set<String> windows = driver.getWindowHandles();
// loop through all window handles
for (String w : windows) {
if(!oW.equalsIgnoreCase(w)) {
// switch to the child tab
driver.switchTo().window(w);
// get element in new tab
WebElement e = driver.findElement(By.xpath("/html/body/main/div/div/h1"));
System.out.println("Text in new tab: " + e.getText());
break;
}
}
// quit the browser
driver.quit();
}
}
Text in new tab is: New Tab
Process finished with exit code 0
在这里,我们获取了新打开选项卡上的文本,并在控制台中收到了消息 - Text in new tab: New Tab 。
最后,收到了消息 Process finished with exit code 0 ,表示代码成功执行。
Example 2
在下面的页面中,单击 New Window Message 。
在单击 New Window Message 后,我们将转到另一个带有文本 New Window Message 的窗口。
关闭新窗口,返回原始窗口,然后获取那里的文本 - Browser Windows 。最后,退出会话。
Code Implementation
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.edge.EdgeDriver;
import java.util.Set;
import java.util.concurrent.TimeUnit;
public class WindowsOpen {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new EdgeDriver();
// adding implicit wait of 20 secs
driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
// Opening the webpage to open a new window
driver.get("https://www.tutorialspoint.com/selenium/practice/browser-windows.php");
// click link to next window
WebElement b = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/button[3]"));
b.click();
// Obtain original window handle id
String oW = driver.getWindowHandle();
// obtain all opened windows handle ids
Set<String> windows = driver.getWindowHandles();
// Loop through all window handles
for (String w : windows) {
if(!oW.equalsIgnoreCase(w)) {
// switch to child window
driver.switchTo().window(w);
// get element in new window
WebElement e = driver.findElement(By.xpath("/html/body/main/div/div/h1"));
System.out.println("Text in new window: " + e.getText());
driver.close();
break;
}
}
// switch to parent window
driver.switchTo().window(oW);
// get element in parent window
WebElement e1 = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/h1"));
System.out.println("Text in parent window: " + e1.getText());
// quit browser session
driver.quit();
}
}
Text in new window: New Window Message
Text in parent window: Browser Windows
在这里,我们捕获了新窗口上的文本,并在控制台中收到了消息 - Text in new window: New Window Message 。然后,我们关闭了子窗口,并返回父窗口。最后,我们已在控制台中获取父窗口上的文本 - Text in parent window: Browser Windows 。
因此,close() 和 quit() 方法之间存在较小差异。close() 方法仅关闭活动浏览器窗口,quit() 方法同时终止所有打开的浏览器窗口。
Example 3
从 4 版本开始,我们可以使用以下方法打开新窗口−
driver.switchTo().newWindow(WindowType.WINDOW)
在浏览器窗口中打开应用程序,并获取文本 - 复选框,如下图所示−
然后打开另一个新窗口并启动文本为 - Radio Button 的不同应用程序。
Code Implementation
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.edge.EdgeDriver;
import java.util.concurrent.TimeUnit;
public class NewWindowOpen {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new EdgeDriver();
// adding implicit wait of 12 secs
driver.manage().timeouts().implicitlyWait(12, TimeUnit.SECONDS);
// Open a webpage in first window
driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");
// get text in first window
WebElement e = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/h1"));
System.out.println("Text: " + e.getText());
// Initiate the another Webdriver
WebDriver newDriver = driver.switchTo().newWindow(WindowType.WINDOW);
// Opening another webpage in second window
driver.get("https://www.tutorialspoint.com/selenium/practice/radio-button.php");
// get text in second window
WebElement e1 = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/form/h1"));
System.out.println("Text in new window: " + e1.getText());
// quit the browser session
driver.quit();
}
}
Text: Check Box
Text in new window: Radio Button
在这里,我们已使用控制台中的消息 - Text: Check Box 捕获了第一个窗口中的文本。然后打开另一个新窗口以启动应用程序。最后,借助控制台中的消息 - Text in new window: Radio Button ,我们在新窗口中获取了文本。
Example 4
从 4 版本开始,我们可以使用以下方法打开新选项卡−
driver.switchTo().newWindow(WindowType.TAB)
在浏览器中打开应用程序,并获取文本 - 复选框,如下图所示−
然后打开另一个新选项卡并启动文本为 - Radio Button 的不同应用程序。
Code Implementation
package org.example;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.WindowType;
import org.openqa.selenium.edge.EdgeDriver;
import java.util.concurrent.TimeUnit;
public class NewTabsOpen {
public static void main(String[] args) throws InterruptedException {
// Initiate the Webdriver
WebDriver driver = new EdgeDriver();
// adding implicit wait of 15 secs
driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
// Open a webpage in first window
driver.get("https://www.tutorialspoint.com/selenium/practice/check-box.php");
// get text in first window
WebElement e = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/h1"));
System.out.println("Text: " + e.getText());
// Initiate the another Webdriver
WebDriver newDriver = driver.switchTo().newWindow(WindowType.TAB);
// Open a webpage in new tab
driver.get("https://www.tutorialspoint.com/selenium/practice/radio-button.php");
// obtain text in other tab
WebElement e1 = driver.findElement(By.xpath("/html/body/main/div/div/div[2]/form/h1"));
System.out.println("Text in other tab: " + e1.getText());
// quit the browser session
driver.quit();
}
}
Text: Check Box
Text in other tab: Radio Button
在这里,我们已使用控制台中的消息 - Text: Check Box 捕获了第一个窗口中的文本。然后打开另一个新选项卡以启动应用程序。最后,借助控制台中的消息 - Text in other tab: Radio Button ,我们在新选项卡中获取了文本。