Java WebDriver打开新选项卡

Java WebDriver打开新选项卡,java,automated-tests,webdriver,selenium-webdriver,Java,Automated Tests,Webdriver,Selenium Webdriver,我已经浏览了web和WebDriver API。我看不到使用WebDriver/Selenium2.0打开新选项卡的方法 有人能确认一下我是否正确吗 谢谢, 克里斯。 注:我看到的当前替代方案是在同一窗口中加载不同的URL或打开新窗口。Selenium WebDriver API目前不支持在浏览器中管理选项卡。尽管没有用于打开新选项卡的API,您只需创建一个WebDriver的新实例,将其称为稍有不同的名称,并在新选项卡中传递所需的URL。一旦您完成了所有需要执行的操作,请关闭该选项卡并将新驱动

我已经浏览了web和WebDriver API。我看不到使用WebDriver/Selenium2.0打开新选项卡的方法

有人能确认一下我是否正确吗

谢谢, 克里斯。
注:我看到的当前替代方案是在同一窗口中加载不同的URL或打开新窗口。

Selenium WebDriver API目前不支持在浏览器中管理选项卡。

尽管没有用于打开新选项卡的API,您只需创建一个WebDriver的新实例,将其称为稍有不同的名称,并在新选项卡中传递所需的URL。一旦您完成了所有需要执行的操作,请关闭该选项卡并将新驱动程序设置为NULL,这样它就不会干扰Webdriver的原始实例。如果需要打开这两个选项卡,请确保引用相应的WebDriver实例。将此应用于Sitecore CMS自动化,效果良好。

我们无法使用web驱动程序/selenium 2.0创建新选项卡或处理选项卡


您可以打开一个新窗口。

使用webdriver完全可以通过跨浏览器的方式来实现这一点,那些说您不能的人只是太懒了。首先,您需要使用WebDriver向打开所需选项卡的页面中插入和锚定标记。我是这样做的(注意:驱动程序是一个WebDriver实例):

接下来,您需要告诉webdriver将其当前窗口句柄切换到新选项卡。我是这样做的:

/**
 * Switches to the non-current window
 */
public void switchWindow() throws NoSuchWindowException, NoSuchWindowException {
    Set<String> handles = driver.getWindowHandles();
    String current = driver.getWindowHandle();
    handles.remove(current);
    String newTab = handles.iterator().next();
    locator.window(newTab);
}
/**
*切换到非当前窗口
*/
public void switchWindow()抛出NoSuchWindowException,NoSuchWindowException{
Set handles=driver.getWindowHandles();
字符串当前值=driver.getWindowHandle();
句柄。移除(当前);
字符串newTab=handles.iterator().next();
定位器窗口(newTab);
}

完成此操作后,您可以使用相同的WebDriver实例与新页面上下文中的元素进行交互。完成该选项卡后,您可以通过使用与上述switchWindow函数类似的机制,始终返回默认窗口上下文。我将把它作为一个练习留给你们去弄清楚。

我必须说我也尝试过这个,虽然它似乎可以与一些绑定(Jonathan说的Java,显然还有ruby)一起工作,但与其他绑定不同:selenium python绑定只报告每个窗口一个句柄,即使包含多个选项卡

也要感谢Jonathan Azoff的好主意

下面是我在Ruby中的实现方式:

def open_new_window(url)
  a = @driver.execute_script("var d=document,a=d.createElement('a');a.target='_blank';a.href=arguments[0];a.innerHTML='.';d.body.appendChild(a);return a", url)
  a.click
  @driver.switch_to.window(@driver.window_handles.last)
end

我宁愿打开一扇新窗户。从自动化解决方案的角度来看,打开新窗口和打开新选项卡真的有区别吗

您可以修改anchors target属性,单击后,目标页面将在新窗口中打开


然后使用
driver.switchTo()
切换到新窗口。使用它来解决您的问题

IJavaScriptExecutor是一个非常有用的类,它可以通过JavaScript在运行时操作HTML DOM,下面是关于如何通过IJavaScriptExecutor在Selenium中打开新浏览器选项卡的示例代码:

IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
                object linkObj = js.ExecuteScript("var link = document.createElement('a');link.target='_blank';link.href='http://www.gmail.com';link.innerHTML='Click Me';document.getElementById('social').appendChild(link);return link");
                /*IWebElement link = (IWebElement)linkObj;
                link.Click();*/
                browser.Click("//*[@id='social']/a[3]");

只是想说明一下,Selenium中没有允许您打开新选项卡的方法,上面的代码将动态创建锚元素并指导它打开新选项卡。

我也遇到了同样的问题,并找到了答案。试试看

Robot r = new Robot(); 
r.keyPress(KeyEvent.VK_CONTROL); 
r.keyPress(KeyEvent.VK_T); 
r.keyRelease(KeyEvent.VK_CONTROL); 
r.keyRelease(KeyEvent.VK_T);

它将打开一个新选项卡,您可以在新选项卡中执行操作。

嘿@Paul,谁会在python中打开第二个选项卡时遇到问题。这是解决办法

        var windowHandles = webDriver.WindowHandles;
        var script = string.Format("window.open('{0}', '_blank');", url);
        scriptExecutor.ExecuteScript(script);
        var newWindowHandles = webDriver.WindowHandles;
        var openedWindowHandle = newWindowHandles.Except(windowHandles).Single();
        webDriver.SwitchTo().Window(openedWindowHandle);
我不确定这是否是webdriver中的一个bug,或者因为它与mutlitab还不兼容,但它肯定是出了问题,我将展示如何修复它

问题: 我看到不止一个问题

第一期必须这样做,当您打开第二个选项卡时,您只能看到一个手柄,而不是两个手柄

第二期这就是我的解决方案。看起来,尽管句柄值仍然存储在驱动程序中,但由于某种原因,该窗口已与之失去同步

以下是解决第二个问题的方法:

elem = browser.find_element_by_xpath("/html/body/div[2]/div[4]/div/a") #href link
time.sleep(2) 
elem.send_keys(Keys.CONTROL + Keys.RETURN + "2") #Will open a second tab

#solution for the 2nd issue is here    
for handle in browser.window_handles:
        print "Handle is:" + str(handle) #only one handle number
        browser.switch_to_window(handle)

time.sleep(3)

#Switch the frame over. Even if you have switched it before you need to do it again
browser.switch_to_frame("Frame") 


"""now this is how you handle closing the tab and working again with the original tab"""

#again switch window over
elem.send_keys(Keys.CONTROL + "w")
for handle in browser.window_handles:
    print "HandleAgain is:" + str(handle) #same handle number as before
    browser.switch_to_window(handle)

#again switch frame over if you are working with one
browser.switch_to_frame("Frame") 

time.sleep(3)
#doing a second round/tab
elem = browser.find_element_by_xpath("/html/body/div[2]/div[4]/div/a") #href link
time.sleep(2) 
elem.send_keys(Keys.CONTROL + Keys.RETURN + "2") #open a 2nd tab again

"""Got it? find the handle, switch over the window then switch the frame"""

这对我来说非常有效。我很乐意回答您的问题……

您可以尝试这种方式,因为在新的webdriver中有
操作链。
我使用的是Python,所以请忽略语法:

act = ActionChains(driver)
act.key_down(Keys.CONTROL)
act.click(link).perform()
act.key_up(Keys.CONTROL)

您可以使用以下代码打开新窗口,而不是打开新选项卡

for(String childTab : driver.getWindowHandles())
    {
        driver.switchTo().window(childTab);
    }
适用于MAC OS

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Firefox()
driver.get("http://google.com")
body = driver.find_element_by_tag_name("body")
body.send_keys(Keys.COMMAND + 't')
这样做

_webDriver.SwitchTo().Window(_webDriver.WindowHandles.Where(x => x != _webDriver.CurrentWindowHandle).First());
或者最后一个()等等


PS不能保证WindowHandles按照浏览器上显示的顺序显示,因此,我建议您在执行导致新选项卡打开的命令之前,保留一些当前窗口的历史记录。然后,您可以将存储的窗口句柄与当前设置进行比较,并切换到列表中的新窗口句柄,其中应该只有一个。

Java Robot可用于发送Ctrl+t(或Cmd+t,如果MAC OS X),如下所示:

int vkControl = IS_OS_MAC ? KeyEvent.VK_META : KeyEvent.VK_CONTROL;
Robot robot = new Robot();
robot.keyPress(vkControl);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(vkControl);
robot.keyRelease(KeyEvent.VK_T);
使用Chrome作为浏览器的完整运行示例可以分叉


我们可以使用键盘事件和自动打开和切换多个标签非常容易。这个例子来自

我已经为你的具体问题添加了正确的答案,但鉴于你关于“备选方案”的陈述,我怀疑你的问题还有更多。如果你想提供更多的上下文,可以给出一个更完整的答案。谢谢Jim,我想确定没有办法处理标签。我所说的“备选方案”只是指如何处理选项卡式浏览,没有特殊情况,因此打开多个窗口对我来说很好。选民:这是你将从项目本身得到的答案。仅仅因为它不是你喜欢的答案,并不意味着它是错误的或质量低劣的。@Kyralessa恭敬地说,我不同意。合理的答案有时是,“你不能那样做。”在这种情况下也是如此。API不支持,也不会支持它。其他答案中的任何所谓变通方法都可能会为您打开一个新选项卡,但不能保证WebDriver能够打开新选项卡。事实上,我
int vkControl = IS_OS_MAC ? KeyEvent.VK_META : KeyEvent.VK_CONTROL;
Robot robot = new Robot();
robot.keyPress(vkControl);
robot.keyPress(KeyEvent.VK_T);
robot.keyRelease(vkControl);
robot.keyRelease(KeyEvent.VK_T);
@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(); 
}

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