버튼을 클릭하면 검색 결과와 함께 새 브라우저 창이 열립니다.
새로 열린 브라우저 창에 연결하고 초점을 맞추는 방법이 있습니까?
그리고 그것으로 작업 한 다음 원래 (첫 번째) 창으로 돌아갑니다.
버튼을 클릭하면 검색 결과와 함께 새 브라우저 창이 열립니다.
새로 열린 브라우저 창에 연결하고 초점을 맞추는 방법이 있습니까?
그리고 그것으로 작업 한 다음 원래 (첫 번째) 창으로 돌아갑니다.
답변:
아래와 같이 창을 전환 할 수 있습니다.
// 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)
getWindowHandles()
세트를 반환 하고 세트는 주문을 보장하지 않기 때문에 올바르지 않습니다 . 마지막 요소가 항상 마지막 창이되는 것은 아닙니다. 그의 댓글이 많은 찬성표를 얻은 것에 놀랐습니다.
내용에 추가하기 위해 ...
기본 창 (기본 창)으로 돌아갑니다.
사용하다 driver.switchTo().defaultContent();
이 스크립트는 부모 창 에서 자식 창으로 전환 하고 다시 부모 창 으로 전환하는 데 도움이됩니다.
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, 당신의 방식은 두 가지 이유로 작동하지 않습니다.
출처 : Internet Explorer 8-10에서 Selenium WebDriver 창 전환 문제
필자의 경우 IE는 레지스트리 편집 후 새 창 핸들을 감지하기 시작했습니다.
탭 프로세스 증가 : IE가 새 탭 프로세스를 생성하는 속도를 설정합니다.
"Max-Number"알고리즘 : 특정 MIC (필수 무결성 수준)에서 단일 프레임 프로세스에 대한 단일 격리 세션에 대해 실행될 수있는 최대 탭 프로세스 수를 지정합니다. 상대 값은 다음과 같습니다.
- TabProcGrowth = 0 : 탭과 프레임이 동일한 프로세스 내에서 실행됩니다. 프레임은 MIC 수준에서 통합되지 않습니다.
- TabProcGrowth = 1 : 주어진 프레임 프로세스에 대한 모든 탭은 주어진 MIC 레벨에 대해 단일 탭 프로세스에서 실행됩니다.
브라우저 : IE11 x64 (줌 : 100 %)
OS : Windows 7 x64
Selenium : 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 ()에 의해 반환 된 마지막 창이 마지막으로 열린 창이 자동으로 가정합니다. 어떤 순서로든 반품이 보장되지 않으므로 반드시 사실은 아닙니다.
Source : Unable to handle a popup in IE, control is not transfer to popup window
다음을 사용할 수 있습니다.
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);
}
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);
}
따라서 이러한 솔루션의 많은 문제는 창이 즉시 표시된다고 가정한다는 것입니다 (즉시 발생하는 것은 없으며 IE에서는 즉시 발생하는 것이 훨씬 적습니다). 또한 요소를 클릭하기 전에 하나의 창이 있다고 가정합니다. 항상 그런 것은 아닙니다. 또한 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();
}
브라우저가 두 개 이상인 경우 (Java 8 사용)
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
public class TestLink {
private static Set<String> windows;
public static void main(String[] args) {
WebDriver driver = new FirefoxDriver();
driver.get("file:///C:/Users/radler/Desktop/myLink.html");
setWindows(driver);
driver.findElement(By.xpath("//body/a")).click();
// get new window
String newWindow = getWindow(driver);
driver.switchTo().window(newWindow);
// Perform the actions on new window
String text = driver.findElement(By.cssSelector(".active")).getText();
System.out.println(text);
driver.close();
// Switch back
driver.switchTo().window(windows.iterator().next());
driver.findElement(By.xpath("//body/a")).click();
}
private static void setWindows(WebDriver driver) {
windows = new HashSet<String>();
driver.getWindowHandles().stream().forEach(n -> windows.add(n));
}
private static String getWindow(WebDriver driver) {
List<String> newWindow = driver.getWindowHandles().stream()
.filter(n -> windows.contains(n) == false).collect(Collectors.toList());
System.out.println(newWindow.get(0));
return newWindow.get(0);
}
}