ボタンをクリックすると、新しいブラウザウィンドウが開き、検索結果が表示されます。
新しく開いたブラウザウィンドウに接続してフォーカスする方法はありますか?
そして、それを使って、元の(最初の)ウィンドウに戻ります。
以下のようにウィンドウを切り替えることができます。
// Store the current window handle
String winHandleBefore = driver.getWindowHandle();
// Perform the click operation that opens new window
// Switch to new window opened
for(String winHandle : driver.getWindowHandles()){
driver.switchTo().window(winHandle);
}
// Perform the actions on new window
// Close the new window, if that window no more required
driver.close();
// Switch back to original browser (first window)
driver.switchTo().window(winHandleBefore);
// Continue with original browser (first window)
コンテンツに追加するだけで...
メインウィンドウ(デフォルトウィンドウ)に戻るには.
driver.switchTo().defaultContent();
を使用します
このスクリプトは、親ウィンドウから子ウィンドウに切り替え、cntrlを親ウィンドウに戻すのに役立ちます
String parentWindow = driver.getWindowHandle();
Set<String> handles = driver.getWindowHandles();
for(String windowHandle : handles)
{
if(!windowHandle.equals(parentWindow))
{
driver.switchTo().window(windowHandle);
<!--Perform your operation here for new window-->
driver.close(); //closing child window
driver.switchTo().window(parentWindow); //cntrl to parent window
}
}
Surya、あなたのやり方はうまくいきません。理由は2つあります:
出典:Internet Explorer 8-10でのSelenium WebDriverウィンドウ切り替えの問題
私の場合、IEはレジストリの編集後に新しいウィンドウハンドルの検出を開始しました。
Tab Process Growth:IEが新しいタブプロセスを作成する速度を設定します。
「最大数」アルゴリズム:これは、特定の必須整合性レベル(MIC)で、単一のフレームプロセスの単一の分離セッションに対して実行できるタブプロセスの最大数を指定します。相対値は次のとおりです。
- TabProcGrowth = 0:タブとフレームは同じプロセス内で実行されます。フレームはMICレベルで統一されていません。
- TabProcGrowth = 1:特定のフレームプロセスのすべてのタブは、特定のMICレベルの単一タブプロセスで実行されます。
ブラウザ:IE11 x64(ズーム:100%)
OS:Windows 7 x64
セレン:3.5.1
WebDriver:IEDriverServer x64 3.5.1
public static String openWindow(WebDriver driver, By by) throws IOException {
String parentHandle = driver.getWindowHandle(); // Save parent window
WebElement clickableElement = driver.findElement(by);
clickableElement.click(); // Open child window
WebDriverWait wait = new WebDriverWait(driver, 10); // Timeout in 10s
boolean isChildWindowOpen = wait.until(ExpectedConditions.numberOfWindowsToBe(2));
if (isChildWindowOpen) {
Set<String> handles = driver.getWindowHandles();
// Switch to child window
for (String handle : handles) {
driver.switchTo().window(handle);
if (!parentHandle.equals(handle)) {
break;
}
}
driver.manage().window().maximize();
}
return parentHandle; // Returns parent window if need to switch back
}
/* How to use method */
String parentHandle = Selenium.openWindow(driver, by);
// Do things in child window
driver.close();
// Return to parent window
driver.switchTo().window(parentHandle);
上記のコードには、 Set<T>
にJavaでの順序が保証されていない として親ウィンドウに切り替えないことを確認するif-checkが含まれています。 WebDriverWait
は、以下のステートメントでサポートされているように、成功の可能性を高めるようです。
ブラウザは新しいウィンドウを確認するのに時間がかかり、ポップアップウィンドウが表示される前にswitchTo()ループに陥ることがあります。
GetWindowHandles()によって返された最後のウィンドウが最後に開かれたウィンドウであると自動的に仮定します。必ずしも順序どおりに返されるとは限らないため、必ずしもそうとは限りません。
次を使用できます。
driver.SwitchTo().Window(WindowName);
WindowNameは、フォーカスを切り替えるウィンドウの名前を表す文字列です。元のウィンドウの名前でこの関数を再度呼び出して、完了したら元のウィンドウに戻ります。
イテレータとwhileループを使用して、さまざまなウィンドウハンドルを保存してから、前後に切り替えます。
//Click your link
driver.findElement(By.xpath("xpath")).click();
//Get all the window handles in a set
Set <String> handles =driver.getWindowHandles();
Iterator<String> it = handles.iterator();
//iterate through your windows
while (it.hasNext()){
String parent = it.next();
String newwin = it.next();
driver.switchTo().window(newwin);
//perform actions on new window
driver.close();
driver.switchTo().window(parent);
}
そのため、これらの多くのソリューションの問題は、ウィンドウが即座に表示されることを前提としていることです(IEでは、すぐに何も起こらず、大幅に少なくなります)。また、要素をクリックする前にウィンドウが1つだけになると想定していますが、常にそうであるとは限りません。また、IEは、予測可能な順序でウィンドウハンドルを返しません。だから私は次のことをするだろう。
public String clickAndSwitchWindow(WebElement elementToClick, Duration
timeToWaitForWindowToAppear) {
Set<String> priorHandles = _driver.getWindowHandles();
elementToClick.click();
try {
new WebDriverWait(_driver,
timeToWaitForWindowToAppear.getSeconds()).until(
d -> {
Set<String> newHandles = d.getWindowHandles();
if (newHandles.size() > priorHandles.size()) {
for (String newHandle : newHandles) {
if (!priorHandles.contains(newHandle)) {
d.switchTo().window(newHandle);
return true;
}
}
return false;
} else {
return false;
}
});
} catch (Exception e) {
Logging.log_AndFail("Encountered error while switching to new window after clicking element " + elementToClick.toString()
+ " seeing error: \n" + e.getMessage());
}
return _driver.getWindowHandle();
}
main you can do :
String mainTab = page.goToNewTab ();
//do what you want
page.backToMainPage(mainTab);
What you need to have in order to use the main
private static Set<String> windows;
//get all open windows
//return current window
public String initWindows() {
windows = new HashSet<String>();
driver.getWindowHandles().stream().forEach(n -> windows.add(n));
return driver.getWindowHandle();
}
public String getNewWindow() {
List<String> newWindow = driver.getWindowHandles().stream().filter(n -> windows.contains(n) == false)
.collect(Collectors.toList());
logger.info(newWindow.get(0));
return newWindow.get(0);
}
public String goToNewTab() {
String startWindow = driver.initWindows();
driver.findElement(By.cssSelector("XX")).click();
String newWindow = driver.getNewWindow();
driver.switchTo().window(newWindow);
return startWindow;
}
public void backToMainPage(String startWindow) {
driver.close();
driver.switchTo().window(startWindow);
}