Java와 함께 Selenium WebDriver를 사용하여 탭 전환
JAVA와 함께 Selenium WebDriver 사용. 새 탭을 열고 일부 작업을 수행하고 이전 탭 (부모)으로 돌아 가야하는 기능을 자동화하려고합니다. 스위치 핸들을 사용했지만 작동하지 않습니다. 그리고 한 가지 이상한 점은 두 탭에 동일한 창 핸들이있어 탭간에 전환 할 수 없습니다.
그러나 다른 Firefox 창으로 시도하면 작동하지만 탭의 경우 작동하지 않습니다.
탭 전환 방법을 도와주세요. 또는 창 핸들을 사용하지 않고 탭을 전환 할 수있는 방법은 제 경우에는 창 핸들이 두 탭과 동일합니다.
(같은 창에서 다른 탭을 열면 창 핸들이 동일하게 유지되는 것을 관찰했습니다)
psdbComponent.clickDocumentLink();
ArrayList<String> tabs2 = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs2.get(1));
driver.close();
driver.switchTo().window(tabs2.get(0));
이 코드는 나를 위해 완벽하게 작동했습니다. 시도해보십시오. 새 탭에서 작업을 수행하기 전에 항상 드라이버를 새 탭으로 전환해야합니다.
이것은 새 탭을 열고, 포커스를 변경하고, 탭을 닫고, 포커스를 이전 / 원래 탭으로 되 돌리는 간단한 솔루션입니다.
@Test
public void testTabs() {
driver.get("https://business.twitter.com/start-advertising");
assertStartAdvertising();
// considering that there is only one tab opened in that point.
String oldTab = driver.getWindowHandle();
driver.findElement(By.linkText("Twitter Advertising Blog")).click();
ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
newTab.remove(oldTab);
// change focus to new tab
driver.switchTo().window(newTab.get(0));
assertAdvertisingBlog();
// Do what you want here, you are in the new tab
driver.close();
// change focus back to old tab
driver.switchTo().window(oldTab);
assertStartAdvertising();
// Do what you want here, you are in the old tab
}
private void assertStartAdvertising() {
assertEquals("Start Advertising | Twitter for Business", driver.getTitle());
}
private void assertAdvertisingBlog() {
assertEquals("Twitter Advertising", driver.getTitle());
}
웹 드라이버가 다른 창을 처리하는 방법과 다른 탭을 처리하는 방법에 차이가 있습니다.
사례 1 :
창이 여러 개있는 경우 다음 코드가 도움이 될 수 있습니다.
//Get the current window handle
String windowHandle = driver.getWindowHandle();
//Get the list of window handles
ArrayList tabs = new ArrayList (driver.getWindowHandles());
System.out.println(tabs.size());
//Use the list of window handles to switch between windows
driver.switchTo().window(tabs.get(0));
//Switch back to original window
driver.switchTo().window(mainWindowHandle);
사례 2 :
동일한 창에 여러 탭이있는 경우 창 핸들이 하나만 있습니다. 따라서 창 핸들 사이를 전환하면 컨트롤이 동일한 탭에 유지됩니다.
이 경우 Ctrl + \ t (Ctrl + Tab)를 사용하여 탭간에 전환하는 것이 더 유용합니다.
//Open a new tab using Ctrl + t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
//Switch between tabs using Ctrl + \t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
자세한 샘플 코드는 http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html 에서 찾을 수 있습니다.
해결
가정 : 웹 페이지에서 무언가를 클릭하면 새 탭이 열립니다.
두 번째 탭으로 전환하려면 아래 논리를 사용하십시오.
new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD2).build().perform();
같은 방식으로 다시 첫 번째 탭으로 전환 할 수 있습니다.
new Actions(driver).sendKeys(driver.findElement(By.tagName("html")), Keys.CONTROL).sendKeys(driver.findElement(By.tagName("html")),Keys.NUMPAD1).build().perform();
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL, Keys.RETURN);
WebElement e = driver.findElement(By
.xpath("html/body/header/div/div[1]/nav/a"));
e.sendKeys(selectLinkOpeninNewTab);//to open the link in a current page in to the browsers new tab
e.sendKeys(Keys.CONTROL + "\t");//to move focus to next tab in same browser
try {
Thread.sleep(8000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
//to wait some time in that tab
e.sendKeys(Keys.CONTROL + "\t");//to switch the focus to old tab again
도움이 되었기를 바랍니다 ..
가장 먼저해야 할 일은 새 탭을 열고 핸들 이름을 저장하는 것입니다. 자동화 서버에서 키를 항상 사용할 수있는 것은 아니기 때문에 키 (ctrl + t)가 아닌 자바 스크립트를 사용하는 것이 가장 좋습니다. 예:
public static String openNewTab(String url) {
executeJavaScript("window.parent = window.open('parent');");
ArrayList<String> tabs = new ArrayList<String>(bot.driver.getWindowHandles());
String handleName = tabs.get(1);
bot.driver.switchTo().window(handleName);
System.setProperty("current.window.handle", handleName);
bot.driver.get(url);
return handleName;
}
두 번째로해야 할 일은 탭 사이를 전환하는 것입니다. 스위치 창 핸들로만 수행하면 작업 할 탭이 항상 작동하지 않고 항상 초점이 맞지 않으며 Selenium이 때때로 실패합니다. 내가 말했듯이 키를 사용하는 것은 약간 문제가 있고 자바 스크립트는 탭 전환을 실제로 지원하지 않기 때문에 경고를 사용하여 탭을 전환하고 매력처럼 작동했습니다.
public static void switchTab(int tabNumber, String handleName) {
driver.switchTo().window(handleName);
System.setProperty("current.window.handle", handleName);
if (tabNumber==1)
executeJavaScript("alert(\"alert\");");
else
executeJavaScript("parent.alert(\"alert\");");
bot.wait(1000);
driver.switchTo().alert().accept();
}
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL,Keys.SHIFT,Keys.TAB);
이 방법은 여러 창 사이를 전환하는 데 도움이됩니다. 이 방법의 제한적인 문제는 필요한 창에 도달 할 때까지 여러 번만 사용할 수 있다는 것입니다. 도움이 되었기를 바랍니다.
Java에서 WebDriver로 firefox 47.0.1을 사용하는 Selenium 2.53.1에서는 탭 수에 관계없이 "driver.getWindowHandles ()"가 하나의 핸들 만 반환하므로 탭간에 전환 할 수 없습니다.
Chrome 51.0을 사용하기 시작하면 모든 핸들을 얻을 수있었습니다. 다음 코드는 각 드라이버 내의 여러 드라이버와 여러 탭에 액세스하는 방법을 보여줍니다.
// INITIALIZE TWO DRIVERS (THESE REPRESENT SEPARATE CHROME WINDOWS)
driver1 = new ChromeDriver();
driver2 = new ChromeDriver();
// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
driver1.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
Thread.sleep(100);
// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs1 = new ArrayList<String> (driver1.getWindowHandles());
// REPEAT FOR THE SECOND DRIVER (SECOND CHROME BROWSER WINDOW)
// LOOP TO OPEN AS MANY TABS AS YOU WISH
for(int i = 0; i < TAB_NUMBER; i++) {
driver2.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
// SLEEP FOR SPLIT SECOND TO ALLOW DRIVER TIME TO OPEN TAB
Thread.sleep(100);
// STORE TAB HANDLES IN ARRAY LIST FOR EASY ACCESS
ArrayList tabs2 = new ArrayList<String> (driver1.getWindowHandles());
// NOW PERFORM DESIRED TASKS WITH FIRST BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
driver1.switchTo().window(tabs1.get(ii));
// LOGIC FOR THAT DRIVER'S CURRENT TAB
}
// PERFORM DESIRED TASKS WITH SECOND BROWSER IN ANY TAB
for(int ii = 0; ii <= TAB_NUMBER; ii++) {
drvier2.switchTo().window(tabs2.get(ii));
// LOGIC FOR THAT DRIVER'S CURRENT TAB
}
여러 브라우저 창에서 여러 탭을 조작하는 방법에 대한 좋은 아이디어를 얻을 수 있기를 바랍니다.
나를 위해 일한 간단한 답변 :
for (String handle1 : driver1.getWindowHandles()) {
System.out.println(handle1);
driver1.switchTo().window(handle1);
}
driver.window_handles
이 순서가 아니기 때문에 더 나은 해결책은 이것입니다.
먼저 바로 가기
Control + X
를 사용하여 첫 번째 탭 으로 전환하여 브라우저 창에서 'x'번째 탭으로 전환합니다.
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "1");
# goes to 1st tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "4");
# goes to 4th tab if its exists or goes to last tab.
최근에 문제가 발생하여 링크가 새 탭에서 열렸지만 셀레늄은 여전히 초기 탭에 집중했습니다.
저는 Chromedriver를 사용하고 있으며 탭에 집중할 수있는 유일한 방법은를 사용하는 것 switch_to_window()
입니다.
다음은 Python 코드입니다.
driver.switch_to_window(driver.window_handles[-1])
따라서 팁은 필요한 창 핸들의 이름을 찾는 것입니다.
driver.window_handles
아래를 봐주세요:
WebDriver driver = new FirefoxDriver();
driver.manage().window().maximize();
driver.get("https://www.irctc.co.in/");
String oldTab = driver.getWindowHandle();
//For opening window in New Tab
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("Hotels & Lounge")).sendKeys(selectLinkOpeninNewTab);
// Perform Ctrl + Tab to focus on new Tab window
new Actions(driver).sendKeys(Keys.chord(Keys.CONTROL, Keys.TAB)).perform();
// Switch driver control to focused tab window
driver.switchTo().window(oldTab);
driver.findElement(By.id("textfield")).sendKeys("bangalore");
도움이 되었기를 바랍니다.
이것은 매우 간단한 프로세스입니다. 두 개의 탭이 있다고 가정하면 client.window(callback)
스위치 명령이 "사용 가능한 첫 번째 탭으로 전환"하기 때문에을 사용하여 먼저 현재 탭을 닫아야합니다 . 그런 다음을 사용하여 탭을 쉽게 전환 할 수 있습니다 client.switchTab
.
브라우저에서 탭을 전환하는 방법에 대한 간단한 예 (하나의 창이있는 경우) :
// open the first tab
driver.get("https://www.google.com");
Thread.sleep(2000);
// open the second tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
driver.get("https://www.google.com");
Thread.sleep(2000);
// switch to the previous tab
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "" + Keys.SHIFT + "" + Keys.TAB);
Thread.sleep(2000);
나는 Thread.sleep(2000)
탭 사이를 전환하는 것을보기 위해 타임 아웃을하기 위해 글을 씁니다 .
다음 탭으로 전환하려면 CTRL + TAB을 사용하고 이전 탭으로 전환하려면 CTRL + SHIFT + TAB을 사용할 수 있습니다.
이것은 Firefox 및 Chrome 용 MacOS에서 작동합니다.
// opens the default browser tab with the first webpage
driver.get("the url 1");
thread.sleep(2000);
// opens the second tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND + "t");
driver.get("the url 2");
Thread.sleep(2000);
// comes back to the first tab
driver.findElement(By.cssSelector("Body")).sendKeys(Keys.COMMAND, Keys.SHIFT, "{");
부모 창 핸들을 얻으려면.
String parentHandle = driverObj.getWindowHandle();
public String switchTab(String parentHandle){
String currentHandle ="";
Set<String> win = ts.getDriver().getWindowHandles();
Iterator<String> it = win.iterator();
if(win.size() > 1){
while(it.hasNext()){
String handle = it.next();
if (!handle.equalsIgnoreCase(parentHandle)){
ts.getDriver().switchTo().window(handle);
currentHandle = handle;
}
}
}
else{
System.out.println("Unable to switch");
}
return currentHandle;
}
선택한 답변의 결함은 불필요하게에서 순서를 가정한다는 것입니다 webDriver.getWindowHandles()
. 이 getWindowHandles()
메서드는 Set
순서를 보장하지 않는를 반환합니다 .
순서를 가정하지 않는 탭을 변경하기 위해 다음 코드를 사용했습니다.
String currentTabHandle = driver.getWindowHandle();
String newTabHandle = driver.getWindowHandles()
.stream()
.filter(handle -> !handle.equals(currentTabHandle ))
.findFirst()
.get();
driver.switchTo().window(newTabHandle);
protected void switchTabsUsingPartOfUrl(String platform) {
String currentHandle = null;
try {
final Set<String> handles = driver.getWindowHandles();
if (handles.size() > 1) {
currentHandle = driver.getWindowHandle();
}
if (currentHandle != null) {
for (final String handle : handles) {
driver.switchTo().window(handle);
if (currentUrl().contains(platform) && !currentHandle.equals(handle)) {
break;
}
}
} else {
for (final String handle : handles) {
driver.switchTo().window(handle);
if (currentUrl().contains(platform)) {
break;
}
}
}
} catch (Exception e) {
System.out.println("Switching tabs failed");
}
}
이 메서드를 호출하고 전환하려는 탭 URL의 하위 문자열 매개 변수를 전달합니다.
public class TabBrowserDemo {
public static void main(String[] args) throws InterruptedException {
System.out.println("Main Started");
System.setProperty("webdriver.gecko.driver", "driver//geckodriver.exe");
WebDriver driver = new FirefoxDriver();
driver.get("https://www.irctc.co.in/eticketing/userSignUp.jsf");
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[text()='Flights']")).click();
waitForLoad(driver);
Set<String> ids = driver.getWindowHandles();
Iterator<String> iterator = ids.iterator();
String parentID = iterator.next();
System.out.println("Parent WIn id " + parentID);
String childID = iterator.next();
System.out.println("child win id " + childID);
driver.switchTo().window(childID);
List<WebElement> hyperlinks = driver.findElements(By.xpath("//a"));
System.out.println("Total links in tabbed browser " + hyperlinks.size());
Thread.sleep(3000);
// driver.close();
driver.switchTo().window(parentID);
List<WebElement> hyperlinksOfParent = driver.findElements(By.xpath("//a"));
System.out.println("Total links " + hyperlinksOfParent.size());
}
public static void waitForLoad(WebDriver driver) {
ExpectedCondition<Boolean> pageLoadCondition = new
ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver driver) {
return ((JavascriptExecutor)driver).executeScript("return document.readyState").equals("complete");
}
};
WebDriverWait wait = new WebDriverWait(driver, 30);
wait.until(pageLoadCondition);
}
참고 URL : https://stackoverflow.com/questions/12729265/switch-tabs-using-selenium-webdriver-with-java
'Development Tip' 카테고리의 다른 글
캐시 라인에 맞추고 캐시 라인 크기 파악 (0) | 2020.12.14 |
---|---|
git에서 매달린 Blob 복구 (0) | 2020.12.14 |
세로로 사진을 찍도록 카메라를 제어해도 최종 이미지가 회전하지 않습니다. (0) | 2020.12.14 |
값을 기준으로 원 크기로 Android에서 애니메이션으로 원을 그리는 방법 (0) | 2020.12.14 |
_ : Swift에서 나에게 말하는 것은 무엇입니까? (0) | 2020.12.14 |