如何使用Selenium WD为不同的浏览器类型打开隐身/私人窗口?

我想在私人窗口隐身窗口中测试我的测试用例。

如何在各种浏览器中执行相同的操作:

  • firefox(首选)
  • 铬(首选)
  • IE
  • 苹果浏览器
  • 歌剧

怎么实现呢?

  • 铬:

    DesiredCapabilities capabilities = DesiredCapabilities.chrome(); ChromeOptions options = new ChromeOptions(); options.addArguments("incognito"); capabilities.setCapability(ChromeOptions.CAPABILITY, options); 
  • 火狐:

     FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.privatebrowsing.autostart", true); 
  • IE浏览器:

     DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); capabilities.setCapability(InternetExplorerDriver.FORCE_CREATE_PROCESS, true); capabilities.setCapability(InternetExplorerDriver.IE_SWITCHES, "-private"); 
  • 歌剧:

     DesiredCapabilities capabilities = DesiredCapabilities.operaBlink(); OperaOptions options = new OperaOptions(); options.addArguments("private"); capabilities.setCapability(OperaOptions.CAPABILITY, options); 

在chrome中你可以尝试在选项中使用-incognito命令行开关,不确定自动化扩展是否会出现问题,但值得一试。

 ChromeOptions options = new ChromeOptions(); options.addArguments("incognito"); 

对于FireFox,配置文件中的特殊标志可用于此目的

 FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.private.browsing.autostart",true); 

对于IE浏览器

 setCapability(InternetExplorerDriver.IE_SWITCHES, "-private"); 

在页面上找到body元素,然后为所需的浏览器触发Key Chord。 在下面的示例中,我尝试将浏览器抽象为枚举,概述了newTabnewWindownewIncognitoWindow的行为。 我制作了内容FF,IE,Chrome,Safari和Opera; 但是,由于我缺乏知识,它们可能无法完全实施。

  /** * Enumeration quantifying some common keystrokes for Browser Interactions. * * @see "http://stackoverflow.com/questions/33224070/how-to-open-incognito-private-window-through-selenium-java" * @author http://stackoverflow.com/users/5407189/jeremiah * @since Oct 19, 2015 * */ public static enum KeystrokeSupport { CHROME, FIREFOX { @Override protected CharSequence getNewIncognitoWindowCommand() { return Keys.chord(Keys.CONTROL, Keys.SHIFT, "p"); } }, IE { @Override protected CharSequence getNewIncognitoWindowCommand() { return Keys.chord(Keys.CONTROL, Keys.SHIFT, "p"); } }, SAFARI { @Override protected CharSequence getNewTabCommand() { throw new UnsupportedOperationException("Author does not know this keystroke"); } @Override protected CharSequence getNewWindowCommand() { throw new UnsupportedOperationException("Author does not know this keystroke"); } @Override protected CharSequence getNewIncognitoWindowCommand() { throw new UnsupportedOperationException("Author does not know this keystroke"); } }, OPERA { @Override protected CharSequence getNewIncognitoWindowCommand() { throw new UnsupportedOperationException("Author does not know this keystroke"); } }; public final void newTab(WebDriver driver) { WebElement target = getKeystrokeTarget(driver); target.sendKeys(getNewTabCommand()); } public final void newWindow(WebDriver driver) { WebElement target = getKeystrokeTarget(driver); target.sendKeys(getNewWindowCommand()); } public final void newIncognitoWindow(WebDriver driver) { WebElement target = getKeystrokeTarget(driver); target.sendKeys(getNewIncognitoWindowCommand()); } protected CharSequence getNewTabCommand() { return Keys.chord(Keys.CONTROL, "t"); } protected CharSequence getNewWindowCommand() { return Keys.chord(Keys.CONTROL, "n"); } protected CharSequence getNewIncognitoWindowCommand() { return Keys.chord(Keys.CONTROL, Keys.SHIFT, "t"); } protected final WebElement getKeystrokeTarget(WebDriver driver) { WebDriverWait wait = new WebDriverWait(driver, 10); return wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("body"))); } } 

然后,我们可以提供参数化测试,该测试将贯穿每个配置并执行行为以进行可视化validation 。 您可能希望在测试中添加所需的断言。

 package stackoverflow.proof.selenium; import java.util.Collection; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.junit.runners.Parameterized.Parameters; import org.openqa.selenium.By; import org.openqa.selenium.Keys; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.ExpectedConditions; import org.openqa.selenium.support.ui.WebDriverWait; import com.google.common.base.Supplier; import com.google.common.collect.Lists; /** * Test to try out some various browser keystrokes and try to get the environment to do what we want. * * @see "http://stackoverflow.com/questions/33224070/how-to-open-incognito-private-window-through-selenium-java" * @author http://stackoverflow.com/users/5407189/jeremiah * @since Oct 19, 2015 * */ @RunWith(Parameterized.class) public class KeyStrokeTests { @Parameters(name="{0}") public static Collection buildTestParams() { Collection params = Lists.newArrayList(); Supplier ffS = new Supplier() { public WebDriver get() { return new FirefoxDriver(); } }; params.add(new Object[]{KeystrokeSupport.FIREFOX, ffS}); /* I'm not currently using these browsers, but this should work with minimal effort. Supplier chrome = new Supplier() { public WebDriver get() { return new ChromeDriver(); } }; Supplier ie = new Supplier() { public WebDriver get() { return new InternetExplorerDriver(); } }; Supplier safari = new Supplier() { public WebDriver get() { return new SafariDriver(); } }; Supplier opera = new Supplier() { public WebDriver get() { return new OperaDriver(); } }; params.add(new Object[]{KeystrokeSupport.CHROME, chrome}); params.add(new Object[]{KeystrokeSupport.IE, ie}); params.add(new Object[]{KeystrokeSupport.SAFARI, safari}); params.add(new Object[]{KeystrokeSupport.OPERA, opera}); */ return params; } Supplier supplier; WebDriver driver; KeystrokeSupport support; public KeyStrokeTests(KeystrokeSupport support,Supplier supplier) { this.supplier = supplier; this.support = support; } @Before public void setup() { driver = supplier.get(); driver.get("http://google.com"); } @Test public void testNewTab() { support.newTab(driver); } @Test public void testNewIncognitoWindow() { support.newIncognitoWindow(driver); } @Test public void testNewWindow() { support.newWindow(driver); } @After public void lookAtMe() throws Exception{ Thread.sleep(5000); for (String handle : driver.getWindowHandles()) { driver.switchTo().window(handle); driver.close(); } } } 

最好的运气。

对于Chrome,请使用此代码以隐身模式打开浏览器:

 public WebDriver chromedriver; ChromeOptions options = new ChromeOptions(); options.addArguments("-incognito"); DesiredCapabilities capabilities = DesiredCapabilities.chrome(); capabilities.setCapability(ChromeOptions.CAPABILITY, options); WebDriver chromedriver=new ChromeDriver(capabilities); chromedriver.get("url"); 
 public static void OpenBrowser() { if (Browser.equals("Chrome")) { System.setProperty("webdriver.chrome.driver", "E:\\Workspace\\proj\\chromedriver.exe"); DesiredCapabilities capabilities = DesiredCapabilities.chrome(); ChromeOptions options = new ChromeOptions(); options.addArguments("incognito"); capabilities.setCapability(ChromeOptions.CAPABILITY, options); driver = new ChromeDriver(capabilities); } else if (Browser.equals("IE")) { DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); capabilities.setCapability(InternetExplorerDriver.FORCE_CREATE_PROCESS, false); // if you get this exception "org.openqa.selenium.remote.SessionNotFoundException: " . uncomment the below line and comment the above line // capabilities.setCapability(InternetExplorerDriver.FORCE_CREATE_PROCESS, true); System.setProperty("webdriver.ie.driver", "E:\\Workspace\\proj\\IEDriverServer32.exe");capabilities.setCapability(InternetExplorerDriver.IE_SWITCHES, "-private"); driver = new InternetExplorerDriver(capabilities); } else { FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.privatebrowsing.autostart", true); driver = new FirefoxDriver(firefoxProfile); } 
 public class gettext { static WebDriver driver= null; public static void main(String args[]) throws InterruptedException { //for private window DesiredCapabilities capabilities = DesiredCapabilities.chrome(); ChromeOptions option = new ChromeOptions(); option.addArguments("incognito"); capabilities.setCapability(ChromeOptions.CAPABILITY,option); System.setProperty("webdriver.chrome.driver", "D:\\Tools\\chromedriver.exe"); driver= new ChromeDriver(capabilities); String url = "https://www.google.com/"; driver.manage().window().maximize(); driver.get(url); driver.manage().timeouts().implicitlyWait(20,TimeUnit.SECONDS); gettextdata(); } } 
 FirefoxOptions opts = new FirefoxOptions(); opts.addArguments("-private"); FirefoxDrive f = new FirefoxDriver(opts); 

这适用于selenium版本3.14.0和geckodriver-v0.22.0