인터넷창에서 새로운 창이 열렸을때는?
//Return handling id
Set<String> ids = driver.getWindowHandles();
getWindowHandles()
는 Set을 return하게 되는데, 윈도우 객체들의 id가 들어있습니다.
첫번째는 첫번째 윈도우.
두번째는 두번째 윈도우
… 이런식으로 증가하게 됨.
//Return handling id
Set<String> ids = driver.getWindowHandles();
Iterator<String> id = ids.iterator();
String parentId = id.next();
String child = id.next();
driver.switchTo().window(child);
윈도우의 정보를 가져오면, Set의 String으로 가져오게되는데, 이것을 iterator로 바꾸어 원하는 값을 찾을때까지 next()
를 해주어야합니다.
이후, driver의 switchTo().window()
를 해주면 바라보는 창이 달라집니다. window()
에는 바꾸고자 하는 윈도우(탭)읠 지정해주어야 합니다.
이것을 하지않으면, 보이는 창은 가장 마지막에 열린 창이 될 수 있으나, 동작은 이전 윈도우에서 계속해서 하고 있을 가능성이 있습니다.
Child window에서 parent로 바꾸기 위해서는 다시 switchTo()
를 해주고 이전 window의 정보를 넘겨주면 됩니다.
close()는 윈도우를 닫아주고,
quit()는 프로세스를 종료해줌. 프로그램 종료.
WebElement clickHere, text;
String parent, child;
clickHere = driver.findElement(By.xpath("//*[@id=\"content\"]/div/a"));
clickHere.click();
Iterator<String> windowsIterator = driver.getWindowHandles().iterator();
parent = windowsIterator.next();
child = windowsIterator.next();
driver.switchTo().window(child);
text = driver.findElement(By.xpath("/html/body/div/h3"));
System.out.println(text.getText());
driver.switchTo().window(parent);
text = driver.findElement(By.xpath("//*[@id=\”content\”]/div/h3"));
System.out.println(text.getText());
대충 위와 같은 방식으로 윈도우를 변경할 수 있다.
일단 특정 윈도우나 탭으로 driver를 switch한 다음, getTitle()을 하면, 해당 Tab의 정보? 를 얻을 수 있습니다.
//get the title every child tabs.
String clickOnLinks = Keys.chord(Keys.COMMAND, Keys.ENTER);
//Open the window on the macOS
for(int I = 1; I < firstColumnLinks.size(); I++) {
firstColumnLinks.get(i).sendKeys(clickOnLinks);
//get the title every child tabs.
Thread.sleep(5000);
}
Set<String> windows = driver.getWindowHandles();
Iterator<String> it = windows.iterator();
while(it.hasNext()) {
driver.switchTo().window(it.next());
System.out.println(driver.getTitle());
}
while()
에서 Iterator의 다음 요소가 존재한다면, 계속해서 창을 바꾸어주면서 참조할 수 있습니다.
Iterator를 사용. 어떠한 집합(Set)은 순서가 없지만, iterator를 사용하면 순차적으로 돌릴 수 있게됩니다.