Java 如何使用 Selenium WD 为不同的浏览器类型打开隐身/私人窗口?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/33224070/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to open incognito/private window with Selenium WD for different browser types?
提问by atul chaurasia
I want to test my test cases in private windowor incognito window.
我想在private window或incognito window 中测试我的测试用例。
How to do the same in various browsers:
如何在各种浏览器中执行相同操作:
- firefox (prefered)
- chrome (prefered)
- IE
- safari
- opera
- 火狐(首选)
- 铬(首选)
- IE
- 苹果浏览器
- 歌剧
How to achieve it?
如何实现?
回答by Jeremiah
Find the body element on the page and then fire off a Key Chord to it for the browser you want. In the sample below I've tried to abstract the browsers to an enumeration that outline the behavior for newTab, newWindowand newIncognitoWindow. I made content FF, IE, Chrome, Safari, and Opera; however, they may not be fully implemented due to my lack of knowledge.
在页面上找到 body 元素,然后为您想要的浏览器触发一个 Key Chord。在下面的示例中,我尝试将浏览器抽象为一个枚举,该枚举概述了newTab、newWindow和newIncognitoWindow的行为。我制作了 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")));
}
}
With that then, we can offer a Parameterized test that will run through each of the configurations and execute the behaviors for visual verification. You may want to add whatever asserts you want to the test.
然后,我们可以提供一个参数化测试,它将运行每个配置并执行视觉验证的行为。您可能想要向测试添加任何您想要的断言。
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<Object[]> buildTestParams() {
Collection<Object[]> params = Lists.newArrayList();
Supplier<WebDriver> ffS = new Supplier<WebDriver>() {
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<WebDriver> chrome = new Supplier<WebDriver>() {
public WebDriver get() {
return new ChromeDriver();
}
};
Supplier<WebDriver> ie = new Supplier<WebDriver>() {
public WebDriver get() {
return new InternetExplorerDriver();
}
};
Supplier<WebDriver> safari = new Supplier<WebDriver>() {
public WebDriver get() {
return new SafariDriver();
}
};
Supplier<WebDriver> opera = new Supplier<WebDriver>() {
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<WebDriver> supplier;
WebDriver driver;
KeystrokeSupport support;
public KeyStrokeTests(KeystrokeSupport support,Supplier<WebDriver> 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();
}
}
}
Best of Luck.
祝你好运。
回答by rac2030
In chrome you can try using -incognito
command line switch in options, not sure if there will be a problem with automation extension but worth a try.
在 chrome 中,您可以尝试-incognito
在选项中使用命令行开关,不确定自动化扩展是否会出现问题,但值得一试。
ChromeOptions options = new ChromeOptions();
options.addArguments("incognito");
For FireFox, a special flag in the profile can be used for the purpose
对于 FireFox,配置文件中的特殊标志可用于
FirefoxProfile firefoxProfile = new FirefoxProfile();
firefoxProfile.setPreference("browser.private.browsing.autostart",true);
For IE
IE浏览器
setCapability(InternetExplorerDriver.IE_SWITCHES, "-private");
回答by agabrys
Chrome:
DesiredCapabilities capabilities = DesiredCapabilities.chrome(); ChromeOptions options = new ChromeOptions(); options.addArguments("incognito"); capabilities.setCapability(ChromeOptions.CAPABILITY, options);
FireFox:
FirefoxProfile firefoxProfile = new FirefoxProfile(); firefoxProfile.setPreference("browser.privatebrowsing.autostart", true);
Internet Explorer:
DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer(); capabilities.setCapability(InternetExplorerDriver.FORCE_CREATE_PROCESS, true); capabilities.setCapability(InternetExplorerDriver.IE_SWITCHES, "-private");
Opera:
DesiredCapabilities capabilities = DesiredCapabilities.operaBlink(); OperaOptions options = new OperaOptions(); options.addArguments("private"); capabilities.setCapability(OperaOptions.CAPABILITY, options);
铬合金:
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);
回答by Maharshi Adiraju
For Chrome use this code to open the browser in incognito mode:
对于 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");
回答by Ranjith Venkatesh
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);
}
回答by palak
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();
}
}
回答by amitkumar
FirefoxOptions opts = new FirefoxOptions();
opts.addArguments("-private");
FirefoxDrive f = new FirefoxDriver(opts);
This works fine for selenium version 3.14.0 and geckodriver-v0.22.0
这适用于 selenium 版本 3.14.0 和 geckodriver-v0.22.0
回答by ModX
I was able to run remote IE in private mode only after following updates:
只有在以下更新后,我才能在私有模式下运行远程 IE:
InternetExplorerOptions options = new InternetExplorerOptions()
.ignoreZoomSettings()
.useCreateProcessApiToLaunchIe()
.addCommandSwitches("-private");
DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
capabilities.setCapability("se:ieOptions", options);
return new RemoteWebDriver(url, capabilities);
All of above didn't work for RemoteWebDriver.
以上所有内容均不适用于 RemoteWebDriver。
回答by beteshnik
How to avoid Extensions in Private Mode prompt
如何避免私人模式下的扩展提示
For the actual geckodriver version I use:
对于我使用的实际 geckodriver 版本:
options.addArguments("-private");
It works fine but the annoying notification appears: Extensions in Private Mode.
它工作正常,但出现烦人的通知:隐私模式下的扩展。
I found the way to avoid it:
我找到了避免它的方法:
options.addPreference("extensions.allowPrivateBrowsingByDefault",true);
As a result all extensions will run in private browsing mode without prompting at start
因此,所有扩展程序都将在隐私浏览模式下运行,而不会在启动时提示