一次硒多个标签

时间:2013-08-09 15:42:40

标签: selenium tabs automated-tests multiple-instances

我正在与Selenium合作,我想知道是否可以同时使用多个TABS?我不想使用多个浏览器实例(即2个双关语的双关语)。如果不可能,那么如何在顺序运行的各个选项卡之间进行切换?

谢谢!

7 个答案:

答案 0 :(得分:27)

如果有链接打开新窗口/标签,则您可以使用driver.switchTo().window();

但是,如果你想在多个窗口上运行某些东西,那么我建议你有多个webdriver实例。它更容易管理,并且受支持(打开新选项卡/窗口时有一些变通方法,例如按下打开新窗口的热键,但不支持它们。)

如果你想让多个线程都在同一个驱动程序实例上运行,但是不同的选项卡,这是不可能的。

答案 1 :(得分:8)

可以在不使用多个浏览器实例的情况下在各个选项卡之间切换 Web驱动程序处理不同窗口以及它如何处理不同选项卡的方式不同。

案例1:
如果有多个窗口,则以下代码可以提供帮助:

//Get the current window handle
String windowHandle = driver.getWindowHandle();

//Get the list of window handles
ArrayList tabs = new ArrayList (driver.getWindowHandles());
System.out.println(tabs.size());
//Use the list of window handles to switch between windows
driver.switchTo().window(tabs.get(0));

//Switch back to original window
driver.switchTo().window(mainWindowHandle);


案例2:
如果同一窗口中有多个选项卡,则只有一个窗口句柄。因此,在窗口手柄之间切换可以将控件保持在同一个选项卡中。
在这种情况下,使用Ctrl + \ t(Ctrl + Tab)在标签之间切换更有用。

//Open a new tab using Ctrl + t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"t");
//Switch between tabs using Ctrl + \t
driver.findElement(By.cssSelector("body")).sendKeys(Keys.CONTROL +"\t");

详细示例代码可在此处找到:
http://design-interviews.blogspot.com/2014/11/switching-between-tabs-in-same-browser-window.html

答案 2 :(得分:2)

要打开多个标签:

driver = new ChromeDriver();
IJavaScriptExecutor jscript = driver as IJavaScriptExecutor;
for (int i = 0; i < 10; i++)
{                
  driver.Navigate().GoToUrl(this.baseURL);      
  jscript.ExecuteScript("window.open('{0}', '_blank');", this.baseURL);
}

他们之间的沟通:

for (int i = 0; i < driver.WindowHandles.Count; i++)
{ 
  driver.SwitchTo().Window(driver.WindowHandles[i])]);
}

答案 3 :(得分:1)

尝试以下代码。

    String oldTab = driver.getWindowHandle();
    driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
    ArrayList<String> newTab = new ArrayList<String>(driver.getWindowHandles());
    newTab.remove(oldTab);
    driver.switchTo().window(newTab.get(0));

答案 4 :(得分:0)

如果您希望同时运行多个wındows,请使用多个IWebDriver实例的线程

EX:

public void Work()
{
IWebDriver driver = new ChromeDriver("D:\\Drivers");
driver.Navigate().GoToUrl(URL);
\\Do the rest
}
public void Work2()
{
IWebDriver driver = new ChromeDriver("D:\\Drivers");
driver.Navigate().GoToUrl(URL2);
\\Do the rest
}

并调用这样的函数:

Thread thread1 = new Thread(new ThreadStart(Work));
thread1.Start();
Thread thread2 = new Thread(new ThreadStart(Work2));
thread2.Start();

答案 5 :(得分:0)

我最近实现了一个简单的多线程实用程序,该实用程序允许在单独线程上的单独选项卡上运行测试,只需一个WEBDRIVER INSTANCE SELECT * FROM @table AS o WHERE EXISTS ( SELECT 1 FROM @table AS i WHERE MONTH(i.Birthdate) = MONTH(o.Birthdate) GROUP BY MONTH(i.Birthdate) HAVING COUNT(*) > 1 ); 的问题在于它一次只能聚焦一个选项卡(窗口)。因此,要在多个选项卡中进行测试,WebDriver必须分别针对每个选项卡。我确定我的实现不是完美的,但是这里是(在Kotlin中的实现):

用法:

WebDriver

实施:

fun test() {

  val results = ParallelNavigator(webDriver, 
    listOf(
    ::test1, 
    ::test2, 
    ::test3
    )
  ).start()

  println(results)
  // Output: [Success, Failure: java.lang.RuntimeException: Some error, Success]

}

fun test1(pn: ParallelNavigator) {

  /* ... open url, find elements etc. so stuff */

  pn.resumeNext() // transfer flow to another unfinished thread (test2 if not finished)

  /* ... do more stuff */

  pn.resumeNext() // again transfer flow to another thread

}

fun test2(pn: ParallelNavigator) { /* ... */ }
fun test3(pn: ParallelNavigator) { /* ... */ }

答案 6 :(得分:0)

如果您使用 nodejs ,这将解决您的问题。

driver.get('https://www.google.com/')
  .then(_ =>
    driver.findElement(webdriver.By.tagName('body'))
  )
  .then(bodyElement => {
    bodyElement.sendKeys(webdriver.Key.chord(webdriver.Key.CONTROL, 't'))
  })
  .catch(err => {
    console.log(err);
  })