[英]How to switch between two windows in browser using Selenium java
I'm working with Selenium Automation.我正在使用 Selenium 自动化。 In this, When i click a link in a current window, a new window opens.在此,当我单击当前窗口中的链接时,会打开一个新窗口。 I just want to switch the control to the new window.我只想将控件切换到新窗口。 But i can't do this.但我不能这样做。 Actually the new window is an auto-generated one.实际上,新窗口是一个自动生成的窗口。 That is, link will be generated dynamically.也就是说,链接将是动态生成的。 Help me friends...帮帮我的朋友...
To switch between windows we have method.要在窗口之间切换,我们有方法。
driver.switchTo().window("window name")
To get the different windows handle, we have method.要获得不同的窗口句柄,我们有方法。
driver.getWindowHandles()
Example:示例:
File file = new File("G:\\Selenium\\All_Jars\\chromedriver.exe");
System.setProperty("webdriver.chrome.driver",file.getAbsolutePath() );
driver = new ChromeDriver();
//Maximize the window
driver.manage().window().maximize();
driver.get("http://www.rediff.com/");
//Get all window handles
Set<String> allHandles = driver.getWindowHandles();
//count the handles Here count is=2
System.out.println("Count of windows:"+allHandles.size());
//Get current handle or default handle
String currentWindowHandle = allHandles.iterator().next();
System.out.println("currentWindow Handle"+currentWindowHandle);
//Remove first/default Handle
allHandles.remove(allHandles.iterator().next());
//get the last Window Handle
String lastHandle = allHandles.iterator().next();
System.out.println("last window handle"+lastHandle);
//switch to second/last window, because we know there are only two windows 1-parent window 2-other window(ad window)
driver.switchTo().window(lastHandle);
System.out.println(driver.getTitle());
driver.findElement(By.tagName("body")).click();
Yes this is possible.是的,这是可能的。 First you need to save the refrence to current window.首先,您需要将引用保存到当前窗口。
String parentWindow= driver.getWindowHandle();
The after having clicked the link, you need to switch to the other window.单击链接后,您需要切换到另一个窗口。
List<String> allWindows = driver.getWindowHandles();
for(String curWindow : allWindows){
driver.switchTo().window(curWindow);
}
This is where you perform operations on new window, finally closing it with这是您在新窗口上执行操作的地方,最后用
driver.close();
and switch back to parent window并切换回父窗口
driver.switchTo().window(parentWindow);
I finally found the answer, I used the below method to switch to the new window,我终于找到了答案,我用下面的方法切换到新窗口,
public String switchwindow(String object, String data){
try {
String winHandleBefore = driver.getWindowHandle();
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
}catch(Exception e){
return Constants.KEYWORD_FAIL+ "Unable to Switch Window" + e.getMessage();
}
return Constants.KEYWORD_PASS;
}
To move to parent window, i used the following code,要移动到父窗口,我使用了以下代码,
public String switchwindowback(String object, String data){
try {
String winHandleBefore = driver.getWindowHandle();
driver.close();
//Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);
//continue with original browser (first window)
}catch(Exception e){
return Constants.KEYWORD_FAIL+ "Unable to Switch to main window" + e.getMessage();
}
return Constants.KEYWORD_PASS;
}
In an excerpt from a getting started with selenium webdriver project on github,在 github 上的selenium webdriver项目入门的摘录中,
/**
* Waits for a window to appear, then switches to it.
* @param regex Regex enabled. Url of the window, or title.
* @return
*/
public AutomationTest waitForWindow(String regex) {
Set<String> windows = driver.getWindowHandles();
for (String window : windows) {
try {
driver.switchTo().window(window);
p = Pattern.compile(regex);
m = p.matcher(driver.getCurrentUrl());
if (m.find()) {
attempts = 0;
return switchToWindow(regex);
}
else {
// try for title
m = p.matcher(driver.getTitle());
if (m.find()) {
attempts = 0;
return switchToWindow(regex);
}
}
} catch(NoSuchWindowException e) {
if (attempts <= MAX_ATTEMPTS) {
attempts++;
try {Thread.sleep(1);}catch(Exception x) { x.printStackTrace(); }
return waitForWindow(regex);
} else {
fail("Window with url|title: " + regex + " did not appear after " + MAX_ATTEMPTS + " tries. Exiting.");
}
}
}
// when we reach this point, that means no window exists with that title..
if (attempts == MAX_ATTEMPTS) {
fail("Window with title: " + regex + " did not appear after 5 tries. Exiting.");
return this;
} else {
System.out.println("#waitForWindow() : Window doesn't exist yet. [" + regex + "] Trying again. " + attempts + "/" + MAX_ATTEMPTS);
attempts++;
return waitForWindow(regex);
}
}
/**
* Switch's to a window that is already in existance.
* @param regex Regex enabled. Url of the window, or title.
* @return
*/
public AutomationTest switchToWindow(String regex) {
Set<String> windows = driver.getWindowHandles();
for (String window : windows) {
driver.switchTo().window(window);
System.out.println(String.format("#switchToWindow() : title=%s ; url=%s",
driver.getTitle(),
driver.getCurrentUrl()));
p = Pattern.compile(regex);
m = p.matcher(driver.getTitle());
if (m.find()) return this;
else {
m = p.matcher(driver.getCurrentUrl());
if (m.find()) return this;
}
}
fail("Could not switch to window with title / url: " + regex);
return this;
}
These are 2 custom functions to help you get started.这些是帮助您入门的 2 个自定义函数。 Or you can check out that project from github to make your selenium projects better designed and easier.或者您可以从 github 查看该项目,以使您的 selenium 项目设计得更好、更容易。
These functions can switch to, or wait for (if it doesn't exist) a window with a certain title / url.这些函数可以切换到或等待(如果它不存在)具有特定标题/网址的窗口。
Set <String> set = driver.getWindowHandles();
Iterator<String> it = set.iterator();
String parentWindowId = it.next();
String childWindowId = it.next();
System.out.println(set);
driver.switchTo().window(childWindowId);
// fetch all windows before clicking on new window link.
Set<String> windowHandles = driver.getWindowHandles();
// Click on link to open new window
driver.findElement(By.tagName("a")).click(); // link to open new window
Set<String> updatedWindowHandles = driver.getWindowHandles();
updatedWindowHandles.removeAll(windowHandles);
for (String window: updatedWindowHandles) {
driver.switchTo().window(window);
}
//to get the current/parent window
String parentWindowContact = driver.getWindowHandle();
//to switch to the new window from current/parent window
Set<String> handleswindow =driver.getWindowHandles();
for(String windowHandle : handleswindow)
{
driver .switch To().window(windowHandle);
}
//to close the new window
driver.close();
//to switch back to the parent window
driver.switchTo().window(parentWindowContact);
o switch back to the parent window
driver.switchTo().window(parentWindowContact);
Here is the best methods to switch in window using index and title.这是使用索引和标题在窗口中切换的最佳方法。 you can add in base class and use it frequently.您可以添加基类并经常使用它。
public void switchToWindow(String windowTitle) {
Set<String> windows = driver.getWindowHandles();
for (String window : windows) {
driver.switchTo().window(window);
if (driver.getTitle().contains(windowTitle)) {
return;
}
}
}
public void switchToWindow(int index) {
Set<String> windows = driver.getWindowHandles();
int totalWin= windows.size();
String winTitle = null;
for(int i=0;i<totalWin;i++) {
if(i==index) {
winTitle = windows.toArray()[i].toString();
}
}
driver.switchTo().window(winTitle);
System.out.println(winTitle);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.