Selenium WebDriver kullanarak yeni bir sekme nasıl açılır?


114

Selenium WebDriver (diğer adıyla Selenium 2) kullanarak mevcut Firefox tarayıcısında yeni bir sekme nasıl açılır?


Hangi programlama dilini kullanıyorsunuz?
alecxe

2
Java kullanıyorum. Bir çözümüm var "m_Driver.findElement (By.cssSelector (" body ")). SendKeys (Keys.CONTROL +" t ");" ve tamamen iyi çalışıyor.
Bhakti Şah

O halde yeni sekmeyi kontrol edebiliyor musunuz? Selenium'un yeni sekmeler için desteği yoktur (bunun yerine yeni pencereler açmaya çalışır). Cevaplarıma bakın stackoverflow.com/questions/14550360/… ve stackoverflow.com/questions/17225911/… . Tam olarak ne başarmaya çalışıyorsun?
Petr Janeček

Bir metni kopyalayıp yeni bir sekme açıp aynı metni yeni sekmeye yapıştırmak istedim. Yeni sekmeyi kontrol etmeye çalışmadım ama başarmak istediğim şey için iyi çalışıyor.
Bhakti Shah

Aynı şeyi o elemanın GetText () 'ini kullanarak yaptım ve sonra Driver.get (text) yaptım.
Bhakti Shah

Yanıtlar:


53

Aşağıdaki kod, bağlantıyı yeni Sekmede açacaktır.

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

Aşağıdaki kod boş yeni Sekme açacaktır.

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

7
mac kullanıyorsanız Keys.CONTROL yerine Keys.COMMAND kullanın
nanospeck

2
Bu çözüm, işletim sistemine özgü (ve belki de tarayıcıya özgü) kısayollara bağlı olduğu için optimumdan az görünüyor ... En azından JS gibi bir şey kullanıyorsanız window.open(), birçok platformda / tarayıcıda çalışmasını bekleyebilirsiniz.
mkasberg

86

Ruby / Python / C # bağlamalarında (Selenium 2.33.0) bir yanıt arayan herkes için.

Gönderilecek gerçek anahtarların işletim sisteminize bağlı olduğunu unutmayın; örneğin COMMAND + t, bunun yerine Mac kullanır CONTROL + t.

yakut

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

piton

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()

C #

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
önceki sekmeye nasıl dönersiniz?
lurscher

11
WebDriver birden fazla sekmeyi idare edebilir - basitçe bunları ayrı pencereler olarak ele alır. Dolayısıyla, yalnızca driver.switchTo().window(windowName);herhangi bir sekmeye veya pencereye erişmeniz gerekir . Açıkçası, aralarında geçişe izin vermek için pencere adlarını normal şekilde takip etmeniz gerekir.
Mark Rowlands

1
Neden bir öğeyi aldığınızı ve bu öğeye Ctrl-t'yi gönderdiğinizi açıklayabilir misiniz? Bu hiç mantıklı değil ... "Bir web öğesinde Ctrl + t" yapamazsınız? Neden sadece yeni Eylemler (WebDriver) .SendKeys (Keys.Control + "w") .Perform (); Lütfen birisi açıklayabilir mi?
Brondahl

1
Bu benim için çalışmıyor. Ctrl + t tuşlarına basmanın birkaç farklı yolunu denedim, hiçbiri yeni bir sekme açmayı başaramadı.
Thayne

4
@Thayne bir ChromeDriver hatası CTRL + T'nin çalışmasını engelliyor. Çözüm olarak CTRL + LMB'yi kullanabilirsiniz. Örnek kod için code.google.com/p/chromedriver/issues/detail?id=903#c2 adresine bakın .
Gili

34

Neden bunu yapmıyorsun

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

açılır pencere engelleyicilerinin çoğu bu girişimi engelleyecektir
Bert Lamb

1
tarayıcı ayarlarınızın kontrolünün sizde olduğu yeri test etmek için muhtemelen güvenli
kernowcode

1
muhtemelen harika çalışırdı. chromedriver tüm uzantıları devre dışı bırakıyor (ör. adblock)
Josh O'Bryan

4
Anahtarları gönderme yöntemi, Chrome 49.0.2623.75m sürümüne güncellendikten sonra artık benim için çalışmıyor ve bu yöntem bu Chrome sürümünde çalışıyor.
Steven

6
Sekmede boş bir sayfa açmak isterseniz, yapabilirsinizdriver.ExecuteScript("window.open('about:blank','_blank');");
Steven

12

JavascriptExecutor kullanarak yeni sekme açmak için,

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

Sekmeyi dizine göre kontrol edecek:

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

Ana sekmede sürücü kontrolü:

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

3 URL başlatmaya ne dersiniz? 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));, Bunu denedim ama dizi istisnadan çıktı, herhangi bir çözüm biliyorsanız lütfen bana bildirin.
cruisepandey

3. sekme için de benzer şekilde çalışır. İstisnanın tam olarak nerede olduğunu öğrenebilir miyim (Sürücü yakınındayken)?
Ishita Shah

Hayır, bu satırda driver.switchTo().window(tabs.get(2));, Bu iyi çalışıyor ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");ancak pencerelere geçmek için herhangi bir kontrolüm olmayacak.
cruisepandey


8

Selenium WebDriver ile Java kullanarak aşağıdaki kodu kullanabilirsiniz:

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

JavaScript kullanarak:

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

Yeni sekmeyi açtıktan sonra o sekmeye geçmesi gerekir:

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

Manuel işlem Ctrl + T yeni bir sekme açmak için burada uygulandı
Ripon Al Wasim

@ Chandra Shekhar: Lütfen yukarıdaki JS kodumu deneyebilir misiniz?
Ripon Al Wasim

@ Shivam: Çok teşekkür ederim. Kodun çalıştığını duymak güzel.
Ripon Al Wasim

5

Bunu FireFox tarayıcısı için deneyin.

/*  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

Aşağıdaki kod bağlantıyı yeni pencerede açacaktır

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

1
tür nesnesi 'Anahtarlar', 'akor' niteliğine sahip değil
Robino

@Robino. Bunu Keys sınıfında görüyorum (org.openqa.Selenium)
MrBCut

3

Buradaki hemen hemen tüm cevaplar güncel değil.

WebDriver artık sekmeleri açma desteğine sahiptir:

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

Yeni bir sekme açacak. Bir pencere açmak aslında standart olmayan bir durum haline geldi:

browser.manage.new_window(:window)

Sekme veya pencere otomatik olarak odaklanmayacaktır. Geçiş yapmak için:

browser.switch_to.window new_tab

2

Selenium WebDriver kullanarak mevcut Chrome tarayıcısında yeni bir sekme açmak için bu kodu kullanabilirsiniz:

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);

Evet, bu iyi çalışıyor, mevcut url'nin aynı sekmesinde yeni bir url açmak, çok fazla kaynak kullanmadığı için birçok bağlantı testi için iyi.
John Peters

2

Bir süredir Chrome'da yeni bir sekme açarken sorun yaşadım. Hattadriver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");Benim için çalışmadı.

Selenyumun sürücüye odaklanmasının yeterli olmadığını öğrendim, Windows da pencerenin önünde olmalı.

Çözümüm, pencereyi öne çıkaracak ve ardından komutu çalıştıracak bir krom uyarısı başlatmaktı. basit kod:

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

1

Selenium 2.52.0'ı Java ve Firefox 44.0.2'de kullanıyorum. Ne yazık ki yukarıdaki çözümlerin hiçbiri benim için işe yaramadı. Sorun şu ki, bir driver.getWindowHandles () 'ı çağırırsam, her zaman 1 tek tutamaç elde ederim. Firefox tek bir işlem olduğundan ve her sekme ayrı bir işlem olmadığından, bu bir şekilde bana mantıklı geliyor. Ama belki yanılıyorum. Her neyse, kendi çözümümü yazmaya çalışıyorum:

        // 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);

Yeni bir sekme açmak için Ctrl + t kombinasyonunu, kapatmak için Ctrl + w ve orijinal sekmeye geri dönmek için Ctrl + 1 (ilk sekme) kullandım. Çözümümün mükemmel veya hatta iyi olmadığının farkındayım ve ayrıca şoförün arama anahtarıyla da geçiş yapmak istiyorum, ancak yazdığım gibi tek bir tutacağım olduğu için bu mümkün değildi. Belki bu, aynı duruma sahip birine yardımcı olacaktır.


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

1

Selenium WebDriver for Java ile Chrome kullanarak yeni bir sekme nasıl açılır?

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);

Yukarıdaki kod ilk uzantıları devre dışı bırakacak ve robot sınıfını kullanarak yeni sekme açılacaktır.


1

Bu kod satırı, selenium webdriver kullanarak yeni bir tarayıcı sekmesi açacaktır

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

Yukarıdaki kodu çalıştırdığımda, kromda yeni bir sekme açtı. Ancak firefox'ta yeni bir pencere açılır. Her iki durumda da pencere işleyicisi yeni açılanlar için farklıdır. Bence sekme aşağı yukarı pencere ile aynı. Elbette, gizli pencere, bir pencerenin normal sekmesinden kesinlikle farklıdır.
MamathaMacherla

1

* JAVA

Kullanmanızı tavsiye ederim JavascriptExecutor:

  • Yeni boş pencere açın:
((JavascriptExecutor) driver).executeScript("window.open()");
  • Belirli bir url ile yeni pencere açın:
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");

İçe aktarmanın ardından:

import org.openqa.selenium.JavascriptExecutor;

0

Nodejs için aynı örnek:

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

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

0

Yeni bir nasıl açılır, ama daha da önemlisi, bu yeni sekmede işleri nasıl yaparsınız? Webdriver, her sekme için yeni bir WindowHandle eklemez ve yalnızca ilk sekmenin kontrolüne sahiptir. Bu nedenle, yeni bir sekme (Control + Sekme Numarası) seçtikten sonra sürücüde .DefaultContent () öğesini, üzerinde çalışacağınız sekme olarak görünür sekmeyi tanımlamak için ayarlayın.

Visual Basic

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 kullanarak mevcut Firefox tarayıcısında yeni bir sekme açmak için

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();

Gelecekte, gönderilerinizin anlaşılmasını kolaylaştırmak için kod parçacığı ile birlikte bazı açıklama metinleri sağlayın.
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

Birden çok sekmenin nasıl açılacağını ve sekmeler arasında nasıl geçiş yapılacağını ve sonunda tüm sekmelerin nasıl kapatılacağını anlamak için bu eksiksiz örneği kontrol edin

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);
 } }

Bu örnek bu web sayfası tarafından verilmiştir


0

Https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465'teki hata nedeniyle webdriver.switch Aslında sekmeler arasında geçiş yapmak için, odak ilk sekmede bırakılır. SwitchWindow'dan sonra bir driver.get yaparak bunu doğrulayabilir ve ikinci sekmenin orijinal sekmeye değil aslında yeni URL'ye gittiğini görebilirsiniz.

Şimdilik geçici çözüm, @ yardening2'nin önerdiği şeydir. Bir uyarıyı açmak için js kullanın ve ardından bunu kabul etmek için webdriver kullanın.


0

Benim için çalışan bu kod (selenyum 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

Soru : Java ile Selenium WebDriver kullanarak yeni bir sekme nasıl açılır?

Cevap : Herhangi bir bağlantıya tıkladıktan sonra yeni sekmeyi açın.

Yeni açılan sekmeyi ele almak istiyorsak, sekmeyi .switchTo (). Window () komutunu kullanarak işlememiz gerekir.

Belirli bir sekmeye geçin, ardından işlemi gerçekleştirin ve ana sekmeye geri dönün.

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 yeni sekmelerin açılmasını desteklemez, sadece yeni pencerelerin açılmasını destekler. Tüm amaçlar için, yeni bir pencere işlevsel olarak yeni bir sekmeye eşdeğerdir.

Bu sorunu çözmek için çeşitli hileler var ancak bunlar uzun vadede size başka sorunlara neden olacaklar.


0

Yeni sekmeyi açmak istiyorsanız bunu kullanabilirsiniz.

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

Bağlantıyı yeni sekmeden açmak istiyorsanız bunu kullanabilirsiniz.

JavascriptExecutor ile:

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

Eylemlerle:

 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 kullanarak tarayıcı penceresini kullanma:

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

Soruyu yanıtlayamaz. Cevabınız zaten var olan bir pencereye geçmekle ilgili, OP yeni bir pencerenin nasıl açılacağını sordu.
Thomas Hirsch
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.