Selenium WebDriver(別名Selenium 2)を使って既存のFirefoxブラウザで新しいタブを開くにはどうすればいいですか?
以下のコードは新しいタブでリンクを開きます。
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);
Ruby/Python/C#バインディング(Selenium 2.33.0)で答えを探している人のために。
実際に送信するキーはOSによって異なります。たとえば、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()
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.ExecuteScript("window.open('your url','_blank');");
Chromeドライバで新しいウィンドウを開くには.
//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);
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()");
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));
}
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));
以下のコードは新しいウィンドウでリンクを開きます
String selectAll = Keys.chord(Keys.SHIFT,Keys.RETURN);
driver.findElement(By.linkText("linkname")).sendKeys(selectAll);
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);
しばらくの間、クロムで新しいタブを開くのに問題がありました。 driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
さえ私のために働きませんでした。
Seleniumがドライバーに焦点を当てているだけでは十分ではないことがわかりました。Windowsもウィンドウを前面に表示する必要があります。
私の解決策は、ウィンドウを前面に持ってきてからコマンドを実行するアラートをchromeで呼び出すことでした。サンプルコード:
((JavascriptExecutor)driver).executeScript("alert('Test')");
driver.switchTo().alert().accept();
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL + "t");
このコード行は、Selenium webdriverを使用して新しいブラウザタブを開きます。
((JavascriptExecutor)getDriver()).executeScript("window.open()");
//to open new tab in existing window
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
私はJavaとFirefox 44.0.2でSelenium 2.52.0を使用しています。残念ながら、上記の解決策のどれも私のために働きませんでした。問題は、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(最初のタブ)を使用しました。私の解決策は完璧ではなかったり、さらに良いとは言えないし、ドライバーのswitchTo呼び出しでも切り替えたいと思っていますが、私が書いたようにハンドルが1つしかないので不可能でした。たぶん、これは同じ状況の人には役立つでしょう。
Selenium WebDriverとJava for 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 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));
}
}
Seleniumは新しいタブを開くことをサポートしていません。新しいウィンドウを開くことだけをサポートします。いずれの目的のためにも、新しいウィンドウは機能的には新しいタブと同等です。
この問題を回避するにはさまざまなハックがありますが、長期的には他の問題を引き起こす可能性があります。
この完全な例をチェックして、複数のタブを開いてタブを切り替え、最後にすべてのタブを閉じる方法を理解してください。
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);
} }
この例は このWebページ によって与えられます
Selenium WebDriverを使用して既存のFirefoxブラウザに新しいタブを開くには
FirefoxDriver driver = new FirefoxDriver();
driver.findElement(By.tagName("body")).sendKeys(Keys.CONTROL,"t");
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
driver.switchTo().window(tabs.get(0));
Actions at=new Actions(wd);
at.moveToElement(we);
at.contextClick(we).sendKeys(Keys.ARROW_DOWN).sendKeys(Keys.ENTER).build().perform();
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)、ドライバに.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()
https://bugs.chromium.org/p/chromedriver/issues/detail?id=1465 webdriver.switchToは実際にはタブを切り替えますが、バグは原因で最初のタブにフォーカスが残ります。 。これを確認するには、switchWindowの後にdriver.getを実行し、2番目のタブが実際には元のタブではなく新しいURLに移動することを確認します。
今のところ回避することは@ yardening2が提案したことです。アラートを開くにはjsを使用し、それを受け入れるにはwebdriverを使用します。