จะเปิดแท็บใหม่ในเบราว์เซอร์ Firefox ที่มีอยู่โดยใช้ Selenium WebDriver (aka Selenium 2) ได้อย่างไร
จะเปิดแท็บใหม่ในเบราว์เซอร์ Firefox ที่มีอยู่โดยใช้ Selenium WebDriver (aka Selenium 2) ได้อย่างไร
คำตอบ:
โค้ดด้านล่างนี้จะเปิดลิงค์ในแท็บใหม่
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);
window.open()
คุณสามารถคาดหวังว่ามันจะทำงานบนแพลตฟอร์ม / เบราว์เซอร์จำนวนมาก
สำหรับใครก็ตามที่กำลังมองหาคำตอบในการผูก Ruby / Python / C # (ซีลีเนียม 2.33.0)
หมายเหตุว่าคีย์ที่เกิดขึ้นจริงที่จะส่งขึ้นอยู่กับระบบปฏิบัติการของคุณตัวอย่างเช่นการใช้ Mac แทน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
Python
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();
}
}
}
driver.switchTo().window(windowName);
เข้าถึงแท็บหรือหน้าต่างใดก็ได้ เห็นได้ชัดว่าคุณต้องติดตามชื่อหน้าต่างตามปกติเพื่อให้สามารถสลับไปมาได้
ทำไมไม่ทำเช่นนี้
driver.ExecuteScript("window.open('your url','_blank');");
driver.ExecuteScript("window.open('about:blank','_blank');");
ในการเปิดแท็บใหม่โดยใช้ 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));
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));
ฉันได้ลองสิ่งนี้แล้ว แต่ได้รับอาร์เรย์ออกจากข้อยกเว้นที่ จำกัด หากคุณทราบวิธีแก้ปัญหาใด ๆ โปรดแจ้งให้เราทราบ
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');");
แต่ฉันจะไม่มีการควบคุมใด ๆ เพื่อเปลี่ยนเป็น windows
เพื่อเปิดหน้าต่างใหม่ใน 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);
คุณสามารถใช้โค้ดต่อไปนี้โดยใช้ Java กับ Selenium WebDriver:
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));
ลองใช้กับเบราว์เซอร์ 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));
}
ขณะนี้ WebDriver รองรับการเปิดแท็บ:
browser = Selenium::WebDriver.for :chrome
new_tab = browser.manage.new_window
จะเปิดแท็บใหม่ การเปิดหน้าต่างกลายเป็นกรณีที่ไม่ได้มาตรฐาน:
browser.manage.new_window(:window)
แท็บหรือหน้าต่างจะไม่ถูกโฟกัสโดยอัตโนมัติ ในการเปลี่ยนไปใช้:
browser.switch_to.window new_tab
หากต้องการเปิดแท็บใหม่ในเบราว์เซอร์ Chrome ที่มีอยู่โดยใช้ Selenium WebDriver คุณสามารถใช้รหัสนี้:
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);
ฉันมีปัญหาในการเปิดแท็บใหม่ใน Chrome มาระยะหนึ่งแล้ว แม้driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
ไม่ได้ผลสำหรับฉัน
ฉันพบว่าซีลีเนียมให้ความสำคัญกับไดรเวอร์ไม่เพียงพอ Windows ก็ต้องมีหน้าต่างอยู่ด้านหน้าด้วย
วิธีแก้ปัญหาของฉันคือเรียกใช้การแจ้งเตือนบน chrome ซึ่งจะนำหน้าต่างมาด้านหน้าจากนั้นดำเนินการคำสั่ง รหัสตัวอย่าง:
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
ฉันใช้ Selenium 2.52.0 ใน Java และ Firefox 44.0.2 น่าเสียดายที่วิธีแก้ปัญหาข้างต้นไม่ได้ผลสำหรับฉัน ปัญหาคือถ้าฉันโทรหา driver.getWindowHandles () ฉันจะได้รับ 1 หมายเลขอ้างอิงเดียวเสมอ อย่างไรก็ตามสิ่งนี้สมเหตุสมผลสำหรับฉันเนื่องจาก 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 (แท็บแรก) ฉันทราบว่าโซลูชันของฉันไม่สมบูรณ์แบบหรือดีและฉันต้องการเปลี่ยนด้วยสวิตช์คนขับในการโทร แต่อย่างที่ฉันเขียนมันเป็นไปไม่ได้เพราะฉันมีที่จับเพียงอันเดียว บางทีนี่อาจเป็นประโยชน์กับคนที่มีสถานการณ์เดียวกัน
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
วิธีเปิดแท็บใหม่โดยใช้ Selenium WebDriver พร้อม Java สำหรับ 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);
โค้ดด้านบนจะปิดการใช้งานส่วนขยายแรกและการใช้แท็บใหม่ของคลาสหุ่นยนต์จะเปิดขึ้น
โค้ดบรรทัดนี้จะเปิดแท็บเบราว์เซอร์ใหม่โดยใช้ selenium webdriver
((JavascriptExecutor)getDriver()).executeScript("window.open()");
* Java
ฉันแนะนำให้ใช้JavascriptExecutor
:
((JavascriptExecutor) driver).executeScript("window.open()");
((JavascriptExecutor) driver).executeScript("window.open('https://google.com')");
กำลังนำเข้า:
import org.openqa.selenium.JavascriptExecutor;
ตัวอย่างเดียวกันสำหรับ nodejs:
var webdriver = require('selenium-webdriver');
...
driver = new webdriver.Builder().
withCapabilities(capabilities).
build();
...
driver.findElement(webdriver.By.tagName("body")).sendKeys(webdriver.Key.COMMAND + "t");
วิธีเปิดใหม่ แต่ที่สำคัญกว่านั้นคุณจะทำสิ่งต่างๆในแท็บใหม่นั้นได้อย่างไร? Webdriver ไม่ได้เพิ่ม WindowHandle ใหม่สำหรับแต่ละแท็บและควบคุมได้เฉพาะแท็บแรกเท่านั้น ดังนั้นหลังจากเลือกแท็บใหม่ (Control + Tab Number) set .DefaultContent () บนไดรเวอร์เพื่อกำหนดแท็บที่มองเห็นได้เป็นแท็บที่คุณกำลังจะดำเนินการ
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()
เพื่อเปิดแท็บใหม่ในเบราว์เซอร์ Firefox ที่มีอยู่โดยใช้ Selenium WebDriver
FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t");
Actions at=new Actions(wd);
at.moveToElement(we);
at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(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);
} }
ตัวอย่างนี้ได้รับจากหน้าเว็บนี้
เนื่องจากข้อผิดพลาดในhttps://bugs.chromium.org/p/chromedriver/issues/detail?id=1465แม้ว่า webdriver.switch ในการสลับแท็บจริงโฟกัสจะถูกทิ้งไว้ที่แท็บแรก คุณสามารถยืนยันสิ่งนี้ได้โดยทำ driver.get หลัง switchWindow และดูว่าแท็บที่สองไปที่ URL ใหม่ไม่ใช่แท็บเดิม
วิธีแก้ปัญหาตอนนี้คือสิ่งที่ @ yardening2 แนะนำ ใช้ js เพื่อเปิดการแจ้งเตือนจากนั้นใช้ webdriver เพื่อยอมรับ
รหัสนี้ใช้ได้กับฉัน (ซีลีเนียม 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();
}
คำถาม : จะเปิดแท็บใหม่โดยใช้ Selenium WebDriver กับ 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));
}
}
ซีลีเนียมไม่รองรับการเปิดแท็บใหม่ แต่รองรับการเปิดหน้าต่างใหม่เท่านั้น สำหรับวัตถุประสงค์ทั้งหมดหน้าต่างใหม่จะทำงานได้เทียบเท่ากับแท็บใหม่
มีแฮ็กต่างๆที่ต้องแก้ไขปัญหา แต่จะทำให้คุณมีปัญหาอื่น ๆ ในระยะยาว
หากคุณต้องการเปิดแท็บใหม่คุณสามารถใช้สิ่งนี้ได้
((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();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");// open in new tab
driver.get("ur link");
การจัดการหน้าต่างเบราว์เซอร์โดยใช้ 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