버튼을 클릭하면 열리는 새 브라우저 창으로 전환하는 방법은 무엇입니까?
버튼을 클릭하면 검색 결과와 함께 새 브라우저 창이 열립니다.
새로 열린 브라우저 창에 연결하고 초점을 맞추는 방법이 있습니까?
그리고 그것으로 작업 한 다음 원래 (첫 번째) 창으로 돌아갑니다.
아래와 같이 창을 전환 할 수 있습니다.
// 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();
이 스크립트는 부모 창 에서 자식 창으로 전환 하고 다시 부모 창 으로 전환하는 데 도움이됩니다.
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, 당신의 방식은 두 가지 이유로 작동하지 않습니다.
- 활성 요소로 전환하기 전에 포커스를 잃어 버리기 때문에 테스트 평가 중에 드라이버를 닫을 수 없으며 NoSuchWindowException이 발생합니다.
- ChromeDriver에서 테스트를 실행하면 창이 표시되지 않고 애플리케이션에서 탭을 클릭합니다. 으로 SeleniumDriver가 탭으로 작동 할 수 없습니다 만이 새 탭이 개방되고있는 클릭에 달려, 창 사이를 switchs 및 시간 제한에 충돌합니다.
IE의 레지스트리 수정 :
- HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
- 마우스 오른쪽 버튼 클릭 → 새로 만들기 → 문자열 값 → 값 이름 : TabProcGrowth (존재하지 않는 경우 생성)
- TabProcGrowth (오른쪽 클릭) → 수정 ... → 값 데이터 : 0
출처 : Internet Explorer 8-10에서 Selenium WebDriver 창 전환 문제
필자의 경우 IE는 레지스트리 편집 후 새 창 핸들을 감지하기 시작했습니다.
MSDN 블로그에서 발췌 :
탭 프로세스 증가 : 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
아래 진술에서 뒷받침하는 성공 가능성을 높이는 것으로 보입니다.
Luke Inman-Semerau 인용 : (Selenium 개발자)
브라우저가 새 창을 인식하는 데 시간이 걸릴 수 있으며 팝업 창이 나타나기 전에 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);
}
}
페이지 개체를 사용하여 제어 할 수있는 자동 창 전환 방법을 좋아합니다.
여러 개의 창이 열려있는 경우이 페이지 개체의 모든 메서드는 제목이 일치하는 브라우저 창에서 실행됩니다.
@Window(".* some windows title goes here .*")
public class ToolsQANewWindow {
// your page object code
}
자세한 단계는 여기에서 확인하십시오-http: //www.testautomationguru.com/selenium-webdriver-automatic-switching-between-browser-windows-using-guice-method-interceptor/
'Program Tip' 카테고리의 다른 글
IE 8 개발자 도구가 Windows에서 작동하지 않습니까? (0) | 2020.10.15 |
---|---|
애플리케이션 로더 : "전달을 진행할 수 없습니다. 기존 전송기 인스턴스가 현재이 패키지를 업로드하고 있습니다." (0) | 2020.10.15 |
Nexus 4가 MTP를 통해 파일을 표시하지 않음 (0) | 2020.10.14 |
데이터 액세스 후 C #에서 Excel 응용 프로그램 프로세스 닫기 (0) | 2020.10.14 |
다른 함수 안에 함수를 정의 할 수없는 이유는 무엇입니까? (0) | 2020.10.14 |