[java] 버튼을 클릭하면 열리는 새 브라우저 창으로 전환하는 방법은 무엇입니까?

버튼을 클릭하면 검색 결과와 함께 새 브라우저 창이 열립니다.

새로 열린 브라우저 창에 연결하고 초점을 맞추는 방법이 있습니까?

그리고 그것으로 작업 한 다음 원래 (첫 번째) 창으로 돌아갑니다.



답변

아래와 같이 창을 전환 할 수 있습니다.

// 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, 당신의 방식은 두 가지 이유로 작동하지 않습니다.

  1. 활성 요소로 전환하기 전에 포커스가 풀리므로 테스트 평가 중에 드라이버를 닫을 수 없으며 NoSuchWindowException이 발생합니다.
  2. ChromeDriver에서 테스트를 실행하면 창이 표시되지 않고 애플리케이션에서 탭을 클릭합니다. 으로 SeleniumDriver가 탭으로 작동 할 수 없습니다 만이 새 탭이 개방되고있는 클릭에 달려, 창 사이를 switchs 및 시간 제한에 충돌합니다.


답변

IE의 레지스트리 수정 :

ie_x64_tabprocgrowth.png

  1. HKEY_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Main
  2. 마우스 오른쪽 버튼 클릭 → 새로 만들기 → 문자열 값 → 값 이름 : TabProcGrowth (존재하지 않는 경우 생성)
  3. TabProcGrowth (오른쪽 클릭) → 수정 … → 값 데이터 : 0

출처 : Internet Explorer 8-10에서 Selenium WebDriver 창 전환 문제

필자의 경우 IE는 레지스트리 편집 후 새 창 핸들을 감지하기 시작했습니다.

MSDN 블로그에서 발췌 :

탭 프로세스 증가 : IE가 새 탭 프로세스를 생성하는 속도를 설정합니다.

“Max-Number”알고리즘 : 특정 MIC (필수 무결성 수준)에서 단일 프레임 프로세스에 대한 단일 격리 세션에 대해 실행될 수있는 최대 탭 프로세스 수를 지정합니다. 상대 값은 다음과 같습니다.

  • TabProcGrowth = 0 : 탭과 프레임이 동일한 프로세스 내에서 실행됩니다. 프레임은 MIC 수준에서 통합되지 않습니다.
  • TabProcGrowth = 1 : 주어진 프레임 프로세스에 대한 모든 탭은 주어진 MIC 레벨에 대해 단일 탭 프로세스에서 실행됩니다.

출처 : 새 탭을 열면 Internet Explorer 8.0에서 새 프로세스가 시작될 수 있습니다.


인터넷 옵션:

  • 보안 → 모든 영역 (인터넷, 로컬 인트라넷, 신뢰할 수있는 사이트, 제한된 사이트)에 대해 보호 모드 활성화 선택 해제
  • 고급 → 보안 → 강화 된 보호 모드 활성화 선택 해제

암호:

브라우저 : 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);
            }