私はSelenium Automationを使用しています。これで、現在のウィンドウのリンクをクリックすると、新しいウィンドウが開きます。コントロールを新しいウィンドウに切り替えたいだけです。しかし、私はこれを行うことができません。実際、新しいウィンドウは自動生成されたものです。つまり、リンクは動的に生成されます。友達を助けて...
ウィンドウを切り替えるには、メソッドがあります。
driver.switchTo().window("window name")
別のウィンドウハンドルを取得するには、メソッドがあります。
driver.getWindowHandles()
例:
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();
はい、可能です。まず、現在のウィンドウに参照を保存する必要があります。
String parentWindow= driver.getWindowHandle();
リンクをクリックした後、別のウィンドウに切り替える必要があります。
List<String> allWindows = driver.getWindowHandles();
for(String curWindow : allWindows){
driver.switchTo().window(curWindow);
}
これは、新しいウィンドウで操作を実行し、最後に
driver.close();
親ウィンドウに戻ります
driver.switchTo().window(parentWindow);
私は最終的に答えを見つけました、私は新しいウィンドウに切り替えるために以下の方法を使用しました、
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;
}
親ウィンドウに移動するには、次のコードを使用しました、
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;
}
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;
}
これらは、始めるのに役立つ2つのカスタム関数です。または、githubからそのプロジェクトをチェックアウトして、Seleniumプロジェクトをより適切に設計し、簡単にすることができます。
これらの関数は、特定のタイトル/ 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);
}
インデックスとタイトルを使用してウィンドウを切り替える最良の方法は次のとおりです。基本クラスに追加して、頻繁に使用できます。
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);
}
//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);