Come aprire una nuova scheda nel browser Firefox esistente utilizzando Selenium WebDriver (noto anche come Selenium 2)?
Come aprire una nuova scheda nel browser Firefox esistente utilizzando Selenium WebDriver (noto anche come Selenium 2)?
Risposte:
Il codice seguente aprirà il collegamento in una nuova scheda.
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,Keys.RETURN);
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
Il codice seguente aprirà una nuova scheda vuota.
String selectLinkOpeninNewTab = Keys.chord(Keys.CONTROL,"t");
driver.findElement(By.linkText("urlLink")).sendKeys(selectLinkOpeninNewTab);
window.open()
, puoi aspettarti che funzioni su molte piattaforme / browser.
Solo per chiunque altro stia cercando una risposta nei collegamenti Ruby / Python / C # (Selenium 2.33.0).
Nota che le chiavi effettive da inviare dipendono dal tuo sistema operativo, ad esempio, Mac utilizza COMMAND + t
, invece di CONTROL + t
.
Rubino
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
Pitone
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();
}
}
}
driver.switchTo().window(windowName);
accedere a qualsiasi scheda o finestra. Ovviamente, dovresti tenere traccia dei nomi delle finestre normalmente per consentire il passaggio da uno all'altro.
Perché non farlo
driver.ExecuteScript("window.open('your url','_blank');");
driver.ExecuteScript("window.open('about:blank','_blank');");
Per aprire una nuova scheda utilizzando JavascriptExecutor,
((JavascriptExecutor) driver).executeScript("window.open()");
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Controllerà sulla scheda come in base all'indice:
driver.switchTo().window(tabs.get(1));
Controllo del driver nella scheda principale:
driver.switchTo().window(tabs.get(0));
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));
, Ho provato questo ma ottenendo array fuori dall'eccezione vincolata, se conosci qualche soluzione per favore fatemelo sapere.
driver.switchTo().window(tabs.get(2));
, funziona bene ((JavascriptExecutor) driver).executeScript("window.open('https://www.stackoverflow.com','_blank');"); Thread.sleep(3000); ((JavascriptExecutor) driver).executeScript("window.open('https://www.flipkart.com','_blank');");
ma non avrò alcun controllo per passare a Windows.
Per aprire una nuova finestra in Chrome Driver.
//The script that will will open a new blank window
//If you want to open a link new tab, replace 'about:blank' with a link
String a = "window.open('about:blank','_blank');";
((JavascriptExecutor)driver).executeScript(a);
È possibile utilizzare il codice seguente utilizzando Java con Selenium WebDriver:
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
Utilizzando JavaScript:
WebDriver driver = new FirefoxDriver();//FF or any other Driver
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("window.open()");
Dopo aver aperto una nuova scheda, è necessario passare a quella scheda:
ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
driver.switchTo().window(tabs.get(1));
Prova questo per il browser 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));
}
Il codice sottostante aprirà il collegamento in una nuova finestra
String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
WebDriver ora ha il supporto per l'apertura delle schede:
browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window
Si aprirà una nuova scheda. Aprire una finestra è diventato effettivamente il caso non standard:
browser.manage.new_window(:window)
La scheda o la finestra non sarà automaticamente focalizzata. Per passare ad esso:
browser.switch_to.window new_tab
Per aprire una nuova scheda nel browser Chrome esistente utilizzando Selenium WebDriver puoi utilizzare questo codice:
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);
Ho avuto problemi ad aprire una nuova scheda in Chrome per un po '. Anchedriver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
per me non ha funzionato.
Ho scoperto che non è sufficiente che il selenio si concentri sul driver, anche Windows deve avere la finestra nella parte anteriore.
La mia soluzione era richiamare un avviso su Chrome che avrebbe portato la finestra in primo piano e quindi eseguire il comando. codice di esempio:
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
Sto usando Selenium 2.52.0 in Java e Firefox 44.0.2. Purtroppo nessuna delle soluzioni di cui sopra ha funzionato per me. Il problema è che se chiamo driver.getWindowHandles () ottengo sempre 1 singolo handle. In qualche modo questo ha senso per me poiché Firefox è un processo singolo e ogni scheda non è un processo separato. Ma forse mi sbaglio. Comunque provo a scrivere la mia soluzione:
// 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);
Ho usato la combinazione Ctrl + t per aprire una nuova scheda, Ctrl + w per chiuderla e per tornare alla scheda originale ho usato Ctrl + 1 (la prima scheda). Sono consapevole che la mia soluzione non è perfetta o addirittura buona e vorrei anche cambiare con il commutatore dell'autista To call, ma come ho scritto non era possibile in quanto avevo una sola maniglia. Forse questo sarà utile a qualcuno con la stessa situazione.
Come aprire una nuova scheda utilizzando Selenium WebDriver con Java per Chrome?
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);
Il codice sopra disabiliterà le prime estensioni e si aprirà una nuova scheda utilizzando la classe robot.
Questa riga di codice aprirà una nuova scheda del browser utilizzando il webdriver selenio
((JavascriptExecutor)getDriver()).executeScript("window.open()");
*GIAVA
Consiglio di utilizzare JavascriptExecutor
:
((JavascriptExecutor) driver).executeScript("window.open()");
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");
Dopo l'importazione:
import org.openqa.selenium.JavascriptExecutor;
Come si apre una nuova scheda, ma soprattutto come si fanno le cose in quella nuova scheda? Webdriver non aggiunge un nuovo WindowHandle per ogni scheda e ha solo il controllo della prima scheda. Quindi, dopo aver selezionato una nuova scheda (Control + Tab Number) imposta .DefaultContent () sul driver per definire la scheda visibile come quella su cui lavorerai.
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()
Actions at=new Actions(wd);
at.moveToElement(we);
at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
controlla questo esempio completo per capire come aprire più schede e passare da una scheda all'altra e alla fine chiudere tutte le schede
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);
} }
Questo esempio è fornito da questa pagina web
A causa di un bug in https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 anche se webdriver.switchTo in realtà cambia scheda, lo stato attivo è lasciato sulla prima scheda. Puoi confermarlo facendo un driver.get dopo switchWindow e vedrai che la seconda scheda va effettivamente al nuovo URL e non alla scheda originale.
Per ora aggirare è ciò che @ yardening2 ha suggerito. Usa js per aprire un avviso e poi usa webdriver per accettarlo.
Questo codice funziona per me (selenio 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();
}
Domanda : come aprire una nuova scheda utilizzando Selenium WebDriver con Java?
Risposta : Dopo aver fatto clic su qualsiasi collegamento, aprire una nuova scheda.
Se vogliamo gestire la scheda aperta di recente, dobbiamo gestire la scheda utilizzando il comando .switchTo (). Window ().
Passa a una scheda particolare, quindi esegui l'operazione e torna alla scheda principale.
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));
}
}
Il selenio non supporta l'apertura di nuove schede, supporta solo l'apertura di nuove finestre. A tutti gli effetti una nuova finestra è comunque funzionalmente equivalente a una nuova scheda.
Ci sono vari hack per aggirare il problema, ma a lungo termine ti causeranno altri problemi.
Se vuoi aprire la nuova scheda puoi usarla
((JavascriptExecutor) getDriver()).executeScript("window.open()");
Se vuoi aprire il link dalla nuova scheda puoi usare questo
con JavascriptExecutor:
public void openFromNewTab(WebElement element){
((JavascriptExecutor)getDriver()).executeScript("window.open('"+element.getAttribute("href")+"','_blank');");
}
con azioni:
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();
Gestione della finestra del browser utilizzando 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