Selenium WebDriver를 사용하여 새 탭을 여는 방법은 무엇입니까?


114

Selenium WebDriver (일명 Selenium 2)를 사용하여 기존 Firefox 브라우저에서 새 탭을 여는 방법은 무엇입니까?


어떤 프로그래밍 언어를 사용하고 있습니까?
alecxe

2
나는 자바를 사용한다. 나는 하나의 솔루션 "m_Driver.findElement (By.cssSelector ("body ")). sendKeys (Keys.CONTROL +"t ");" 완전히 잘 작동합니다.
Bhakti Shah

그러면 새 탭을 제어 할 수 있습니까? Selenium은 새 탭을 지원하지 않습니다 (대신 새 창을 열려고 시도 함). 내 답변 stackoverflow.com/questions/14550360/…stackoverflow.com/questions/17225911/…을 참조하십시오 . 정확히 무엇을 달성하려고합니까?
Petr Janeček 2013

일부 텍스트를 복사 한 다음 새 탭을 열고 동일한 텍스트를 새 탭에 붙여넣고 싶었습니다. 나는 새 탭을 제어하려고 시도하지 않았지만 내가 원하는 것을 위해 잘 작동합니다.
Bhakti Shah

해당 요소의 GetText ()를 사용하여 동일한 작업을 수행 한 다음 Driver.get (text)를 수행했습니다.
Bhakti Shah

답변:


53

아래 코드는 새 탭에서 링크를 엽니 다.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN); 
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

아래 코드는 빈 새 탭을 엽니 다.

String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);

7
Mac을 사용하는 경우 Keys.CONTROL 대신 Keys.COMMAND를 사용하십시오
nanospeck

2
이 솔루션은 OS 별 (및 브라우저 별) 바로 가기에 의존하기 때문에 최적이 아닌 것 같습니다. 적어도 JS와 같은 것을 사용 window.open()하면 많은 플랫폼 / 브라우저에서 작동 할 것으로 예상 할 수 있습니다.
mkasberg

86

Ruby / Python / C # 바인딩 (Selenium 2.33.0)에서 답을 찾고있는 다른 사람을위한 것입니다.

전송의 실제 키는 예를 들어, 맥 사용을 위해, 당신의 OS에 따라 달라집니다 COMMAND + t대신, CONTROL + t.

루비

require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get('http://stackoverflow.com/')

body = driver.find_element(:tag_name => 'body')
body.send_keys(:control, 't')

driver.quit

파이썬

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://stackoverflow.com/")

body = driver.find_element_by_tag_name("body")
body.send_keys(Keys.CONTROL + 't')

driver.close()

씨#

using OpenQA.Selenium;
using OpenQA.Selenium.Firefox;

namespace StackOverflowTests {

    class OpenNewTab {

        static void Main(string[] args) {

            IWebDriver driver = new FirefoxDriver();
            driver.Navigate().GoToUrl("http://stackoverflow.com/");

            IWebElement body = driver.FindElement(By.TagName("body"));
            body.SendKeys(Keys.Control + 't');

            driver.Quit();
        }
    }
}

3
이전 탭으로 어떻게 돌아가나요?
lurscher 2013

11
WebDriver는 둘 이상의 탭을 처리 할 수 ​​있습니다. 간단하게 별도의 창으로 처리합니다. 따라서 driver.switchTo().window(windowName);탭이나 창에 액세스하기 만하면됩니다. 분명히 창 이름을 정상적으로 추적하여 전환 할 수 있도록해야합니다.
Mark Rowlands 2013

1
요소를 검색하고 해당 요소에 Ctrl-t를 보내는 이유를 설명해 주시겠습니까? 말이 안 돼요 ... "웹 요소에서 Ctrl + t"를 사용할 수 없습니까? new Actions (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); 누군가 설명해 주시겠습니까?
Brondahl

1
이것은 나를 위해 작동하지 않습니다. Ctrl + t를 누르는 여러 가지 방법을 시도했지만 새 탭을 여는 데 성공한 방법은 없습니다.
Thayne 2014

4
@Thayne ChromeDriver 버그로 인해 CTRL + T가 작동하지 않습니다. 해결 방법으로 CTRL + LMB를 사용할 수 있습니다. 샘플 코드는 code.google.com/p/chromedriver/issues/detail?id=903#c2 를 참조하세요 .
Gili

34

왜 안돼

driver.ExecuteScript("window.open('your url','_blank');");

대부분의 팝업 차단기는이 시도를 차단합니다
버트 램

1
당신이 당신의 브라우저 설정을 제어 어디에 테스트 아마 안전
kernowcode

1
아마 잘 작동 할 것입니다. chromedriver는 모든 확장 프로그램 (예 : adblock)을 비활성화하는 것으로 보입니다
Josh O'Bryan

4
Chrome 49.0.2623.75m로 업데이트 한 후 키 보내기 방법이 더 이상 작동하지 않으며이 방법은 해당 Chrome 버전에서 작동합니다.
Steven

6
탭에서 빈 페이지를 열려면 다음을 수행 할 수 있습니다driver.ExecuteScript("window.open('about:blank','_blank');");
Steven

12

JavascriptExecutor를 사용하여 새 탭을 열려면,

((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));

색인에 따라 탭에서 제어합니다.

driver.switchTo().window(tabs.get(1));

메인 탭의 드라이버 컨트롤 :

driver.switchTo().window(tabs.get(0));

3 개의 URL을 시작하는 것은 어떻습니까? driver.switchTo().window(tabs.get(1)); driver.get("https://www.stackoverflow.com"); Thread.sleep(2000); driver.switchTo().window(tabs.get(2)); driver.get("https://www.flipkart.com"); Thread.sleep(2000); driver.close(); driver.switchTo().window(tabs.get(1)); Thread.sleep(2000); driver.close(); driver.switchTo().window(tabs.get(0));, 나는 이것을 시도했지만 배열 예외를 벗어났습니다. 어떤 해결책을 안다면 알려주십시오.
cruisepandey

세 번째 탭에서도 비슷하게 작동합니다. 정확히 어디에서 예외가 발생하는지 알 수 있습니까 (드라이버 종료시)?
Ishita Shah

아니요,이 줄 driver.switchTo().window(tabs.get(2));에서는 잘 작동 ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");하지만 창으로 전환 할 컨트롤이 없습니다.
cruisepandey


8

Selenium WebDriver와 함께 Java를 사용하여 다음 코드를 사용할 수 있습니다.

driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

JavaScript를 사용하여 :

WebDriver driver = new FirefoxDriver();//FF or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");

새 탭을 연 후 해당 탭으로 전환해야합니다.

ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));

새 탭을 열 수있는 수동 조작 Ctrl 키 + T는 여기에 구현 된
리폰 알 Wasim

@ Chandra Shekhar : 위의 JS 코드를 사용해 주시겠습니까?
Ripon Al Wasim

@ Shivam : 대단히 감사합니다. 코드가 작동하는 것을 듣는 것이 좋습니다.
Ripon Al Wasim

5

FireFox 브라우저에서 사용해보십시오.

/*  Open new tab in browser */
public void openNewTab()
{
    driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
    ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
    driver.switchTo().window(tabs.get(0));
}

3

아래 코드는 새 창에서 링크를 엽니 다.

String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);

1
유형 객체 'Keys'에는 'chord'속성이 없습니다
Robino

@Robino. 나는 그것을 Keys 클래스 (org.openqa.Selenium)에서 본다
MrBCut

3

여기에있는 거의 모든 답변은 구식입니다.

WebDriver는 이제 탭 열기를 지원합니다.

browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window

새 탭이 열립니다. 창을 여는 것은 실제로 비표준 사례가되었습니다.

browser.manage.new_window(:window)

탭이나 창에 자동으로 초점이 맞춰지지 않습니다. 전환하려면 :

browser.switch_to.window new_tab

2

Selenium WebDriver를 사용하여 기존 Chrome 브라우저에서 새 탭을 열려면 다음 코드를 사용할 수 있습니다.

driver.FindElement(By.CssSelector("body")).SendKeys(Keys.Control + "t");        
string newTabInstance = driver.WindowHandles[driver.WindowHandles.Count-1].ToString();
driver.SwitchTo().Window(newTabInstance);
driver.Navigate().GoToUrl(url);

예, 이것은 많은 리소스를 사용하지 않기 때문에 기존 URL의 동일한 탭에서 새 URL을 열어서 많은 링크 테스트에 좋습니다.
John Peters

2

한동안 크롬에서 새 탭을 여는 데 문제가있었습니다. 심지어 driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");나를 위해 작동하지 않았다.

나는 셀레늄이 드라이버에 초점을 맞추는 것만으로는 충분하지 않다는 것을 알았습니다. 윈도우도 전면에 창을 가져야합니다.

내 해결책은 창을 맨 앞으로 가져오고 명령을 실행하는 크롬에 대한 경고를 호출하는 것이 었습니다. 샘플 코드 :

((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

1

Java 및 Firefox 44.0.2에서 Selenium 2.52.0을 사용하고 있습니다. 불행히도 위의 솔루션 중 어느 것도 나를 위해 일하지 않았습니다. 문제는 내가 driver.getWindowHandles ()를 호출하면 항상 하나의 단일 핸들을 얻는 것입니다. Firefox는 단일 프로세스이고 각 탭이 별도의 프로세스가 아니기 때문에 어떻게 든 이것은 나에게 의미가 있습니다. 하지만 내가 틀렸을 수도 있습니다. 어쨌든 내 자신의 솔루션을 작성하려고합니다.

        // open a new tab
        driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");

        //url to open in a new tab
        String urlToOpen = "https://url_to_open_in_a_new_tab";

        Iterator<String> windowIterator = driver.getWindowHandles()
                .iterator();
        //I always get handlesSize == 1, regardless how many tabs I have
        int handlesSize = driver.getWindowHandles().size();

        //I had to grab the original handle
        String originalHandle = driver.getWindowHandle();

        driver.navigate().to(urlToOpen);

        Actions action = new Actions(driver);
        // close the newly opened tab
        action.keyDown(Keys.CONTROL).sendKeys("w").perform();
        // switch back to original
        action.keyDown(Keys.CONTROL).sendKeys("1").perform();

        //and switch back to the original handle. I am not sure why, but
        //it just did not work without this, like it has lost the focus
        driver.switchTo().window(originalHandle);

Ctrl + t 조합을 사용하여 새 탭을 열고 Ctrl + w를 사용하여 닫고 원래 탭으로 다시 전환하려면 Ctrl + 1 (첫 번째 탭)을 사용했습니다. 나는 내 솔루션이 완벽하지 않거나 심지어 좋지 않다는 것을 알고 있으며 운전자의 switchTo 호출로 전환하고 싶지만 내가 쓴대로 핸들이 하나 밖에 없었기 때문에 불가능했습니다. 아마도 이것은 같은 상황을 가진 사람에게 도움이 될 것입니다.


1
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

1

Chrome 용 Java와 함께 Selenium WebDriver를 사용하여 새 탭을 여는 방법은 무엇입니까?

ChromeOptions options = new ChromeOptions();
options.addArguments("--disable-extensions");
driver = new ChromeDriver(options);
driver.manage().window().maximize();
driver.navigate().to("https://google.com");     
Robot robot = new Robot();
robot.keyPress(KeyEvent.VK_CONTROL);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(KeyEvent.VK_CONTROL);
robot.keyRelease(KeyEvent.VK_T);

위의 코드는 첫 번째 확장을 비활성화하고 로봇 클래스를 사용하면 새 탭이 열립니다.


1

이 코드 줄은 셀레늄 웹 드라이버를 사용하여 새 브라우저 탭을 엽니 다.

((JavascriptExecutor)getDriver()).executeScript("window.open()");

위의 코드를 실행했을 때 크롬에서 새 탭이 열렸습니다. 그러나 firefox에서는 새 창이 열립니다. 두 경우 모두 새로 열린 창 처리기는 다릅니다. 그래서 저는 탭이 창과 다소 비슷하다고 생각합니다. 물론 시크릿 창은 창의 일반 탭과 확실히 다릅니다.
MamathaMacherla

1

*자바

다음을 사용하는 것이 좋습니다 JavascriptExecutor.

  • 새 빈 창 열기 :
((JavascriptExecutor) driver).executeScript("window.open()");
  • 특정 URL로 새 창 열기 :
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

가져 오기 후 :

import org.openqa.selenium.JavascriptExecutor;

0

nodejs에 대한 동일한 예 :

var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
                    withCapabilities(capabilities).
                    build();
...

driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");

0

새 탭을 여는 방법,하지만 더 중요한 것은 새 탭에서 작업하는 방법입니다. Webdriver는 각 탭에 대해 새 WindowHandle을 추가하지 않으며 첫 번째 탭만 제어합니다. 따라서 새 탭 (Control + Tab Number)을 선택한 후 드라이버에서 .DefaultContent ()를 설정하여 작업 할 탭으로 표시되는 탭을 정의합니다.

비주얼 베이직

Dim driver = New WebDriver("Firefox", BaseUrl)

' Open new tab - send Control T
Dim body As IWebElement = driver.FindElement(By.TagName("body"))
body.SendKeys(Keys.Control + "t")

' Go to a URL in that tab
driver.GoToUrl("YourURL")


' Assuming you have m tabs open, go to tab n by sending Control + n
body.SendKeys(Keys.Control + n.ToString())

' Now set the visible tab as the drivers default content.
driver.SwitchTo().DefaultContent()

0

Selenium WebDriver를 사용하여 기존 Firefox 브라우저에서 새 탭을 열려면

FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t"); 

0
 Actions at=new Actions(wd);
 at.moveToElement(we);
 at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();

앞으로 게시물을 더 쉽게 이해할 수 있도록 코드 스 니펫과 함께 설명 텍스트를 제공하세요.
Tyler Jandreau

0
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");

ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());

driver.switchTo().window(tabs.get(0));

0

이 전체 예제를 확인하여 여러 탭을 열고 탭 사이를 전환하고 마지막에 모든 탭을 닫는 방법을 이해하십시오.

public class Tabs {

 WebDriver driver; 

 Robot rb;


 @BeforeTest
 public void setup() throws Exception {
  System.setProperty("webdriver.chrome.driver", "C:\\Users\\Anuja.AnujaPC\\Downloads\\chromedriver_win32\\chromedriver.exe");
  WebDriver driver=new ChromeDriver();
  driver.manage().window().maximize();
  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  driver.get("http://qaautomated.com");
 }

 @Test
 public void openTab() {
  //Open tab 2 using CTRL + t keys.
  driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");


 //Open URL In 2nd tab.
  driver.get("http://www.qaautomated.com/p/contact.html");

  //Call switchToTab() method to switch to 1st tab
  switchToTab(); 


  //Call switchToTab() method to switch to 2nd tab.
  switchToTab();


 } 

 public void switchToTab() {
  //Switching between tabs using CTRL + tab keys.
  driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");
  //Switch to current selected tab's content.
  driver.switchTo().defaultContent();  
 } 



@AfterTest
 public void closeTabs() throws AWTException {
  //Used Robot class to perform ALT + SPACE + 'c' keypress event.
  rb =new Robot();
  rb.keyPress(KeyEvent.VK_ALT);
  rb.keyPress(KeyEvent.VK_SPACE);
  rb.keyPress(KeyEvent.VK_C);
 } }

이 예제는 이 웹 페이지에서 제공합니다.


0

https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465의 버그로 인해 webdriver.switchTo가 실제로 탭을 전환하더라도 포커스는 첫 번째 탭에 남아 있습니다. switchWindow 다음에 driver.get을 수행하여이를 확인할 수 있으며 두 번째 탭이 실제로 원래 탭이 아닌 새 URL로 이동하는 것을 확인할 수 있습니다.

현재 해결 방법은 @ yardening2가 제안한 것입니다. js를 사용하여 경고를 연 다음 webdriver를 사용하여 수락하십시오.


0

이 코드는 나를 위해 작동합니다 (selenium 3.8.1, chromedriver = 2.34.522940, chrome = 63.0) :

public void openNewTabInChrome() {

    driver.get("http://www.google.com");

    WebElement element = driver.findElement(By.linkText("Gmail"));
    Actions actionOpenLinkInNewTab = new Actions(driver);
    actionOpenLinkInNewTab.moveToElement(element)
            .keyDown(Keys.CONTROL) // MacOS: Keys.COMMAND
            .keyDown(Keys.SHIFT).click(element)
            .keyUp(Keys.CONTROL).keyUp(Keys.SHIFT).perform();


    ArrayList<String> tabs = new ArrayList(driver.getWindowHandles());
    driver.switchTo().window(tabs.get(1));
    driver.get("http://www.yahoo.com");
    //driver.close();
}

0

질문 : Selenium WebDriver with Java를 사용하여 새 탭을 여는 방법은 무엇입니까?

대답 : 링크를 클릭 한 후 새 탭을 엽니 다.

새로 열린 탭을 처리하려면 .switchTo (). window () 명령을 사용하여 탭을 처리해야합니다.

특정 탭으로 전환 한 다음 작업을 수행하고 상위 탭으로 다시 전환합니다.

package test;

import java.util.ArrayList;

import org.openqa.selenium.By;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.firefox.FirefoxDriver;

public class Tab_Handle {

    public static void main(String[] args) {

        System.setProperty("webdriver.gecko.driver", "geckodriver_path");

        WebDriver driver = new FirefoxDriver();

        driver.get("http://www.google.com");

        // Store all currently open tabs in Available_tabs
        ArrayList<String> Available_tabs = new ArrayList<String>(driver.getWindowHandles());

        // Click on link to open in new tab
        driver.findElement(By.id("Url_Link")).click();

        // Switch newly open Tab
        driver.switchTo().window(Available_tabs.get(1));

        // Perform some operation on Newly open tab
        // Close newly open tab after performing some operations.
        driver.close();

        // Switch to old(Parent) tab.
        driver.switchTo().window(Available_tabs.get(0));

    }

}

0

Selenium은 새 탭 열기를 지원하지 않으며 새 창 열기 만 지원합니다. 모든 의도를 위해 새 창은 기능적으로 새 탭과 동일합니다.

이 문제를 해결할 수있는 다양한 해킹이 있지만 장기적으로 다른 문제를 일으킬 것입니다.


0

새 탭을 열려면 이것을 사용할 수 있습니다.

 ((JavascriptExecutor) getDriver()).executeScript("window.open()");

새 탭에서 링크를 열려면 이것을 사용할 수 있습니다.

JavascriptExecutor 사용 :

 public void openFromNewTab(WebElement element){
            ((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
        }

작업 포함 :

 WebElement element = driver.findElement(By.xpath("your_xpath"));
 Actions actions = new Actions(driver);
        actions.keyDown(Keys.LEFT_CONTROL)
                .click(element)
                .keyUp(Keys.LEFT_CONTROL)
                .build()
                .perform();

-1
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");// open in new tab
driver.get("ur link");

-1

Selenium Webdriver를 사용하여 브라우저 창 처리 :

String winHandleBefore = driver.getWindowHandle();

for(String winHandle : driver.getWindowHandles())  // Switch to new opened window
{
    driver.switchTo().window(winHandle);
}

driver.switchTo().window(winHandleBefore);   // move to previously opened window

질문을 해결하지 못했습니다. 당신은 이미 존재하는 창으로 전환하는 것에 대한 대답이며 OP는 새 창을 여는 방법을 물었습니다.
Thomas Hirsch
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.