【问题标题】:How to open incognito/private window with Selenium WD for different browser types?如何使用 Selenium WD 为不同的浏览器类型打开隐身/私人窗口?
【发布时间】:2016-01-18 08:52:45
【问题描述】:

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

如何在各种浏览器中做同样的事情:

  • firefox(首选)
  • 镀铬(首选)
  • IE
  • 野生动物园
  • 歌剧

如何实现?

【问题讨论】:

标签: java browser selenium-webdriver


【解决方案1】:

在页面上找到 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")));
        }

    }

然后,我们可以提供一个参数化测试,它将贯穿每个配置并执行视觉验证的行为。你可能想在测试中添加任何你想要的断言。

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

祝你好运。

【讨论】:

  • 我讨厌看到可能可行的想法,但只有很少的负票和没有 cmets 这有什么问题。
【解决方案2】:

在chrome中你可以尝试在options中使用-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");

【讨论】:

  • 上面的Firefox代码在我的情况下不起作用。
【解决方案3】:
  • 铬:

    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);
    
  • Internet Explorer:

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

【讨论】:

  • 对于未来的访问者 - 这不适用于 selenium 2.53,适用于 2.52。
  • 哪些点不起作用?我们使用 Selenium 3.0.1,一切正常。
  • 是的,它适用于 3.0.1,遗憾的是我无法(允许阅读)升级到最新版本。我已经浪费了两个多小时所以我认为这可能对面临同样问题的人有益。
  • 上面的 Firefox 代码在我的情况下不起作用
【解决方案4】:

对于 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");

【讨论】:

    【解决方案5】:
    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);
        }
    

    【讨论】:

      【解决方案6】:
      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();
        } 
      }
      

      【讨论】:

        【解决方案7】:
        FirefoxOptions opts = new FirefoxOptions();
        opts.addArguments("-private");
        FirefoxDrive f = new FirefoxDriver(opts);
        

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

        【讨论】:

          【解决方案8】:

          只有在以下更新后,我才能在私有模式下运行远程 IE:

          InternetExplorerOptions options = new InternetExplorerOptions()
                              .ignoreZoomSettings()
                              .useCreateProcessApiToLaunchIe()
                              .addCommandSwitches("-private");
          
          DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
                      capabilities.setCapability("se:ieOptions", options);
          return new RemoteWebDriver(url, capabilities);
          

          以上所有方法都不适用于 RemoteWebDriver。

          【讨论】:

            【解决方案9】:

            如何在私有模式提示下避免扩展

            对于我使用的实际 geckodriver 版本:

                options.addArguments("-private");
            

            它工作正常,但出现烦人的通知:私人模式下的扩展。

            我找到了避免它的方法:

                options.addPreference("extensions.allowPrivateBrowsingByDefault",true);
            

            因此所有扩展都将在隐私浏览模式下运行而不会在启动时提示

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-03-03
              • 1970-01-01
              • 2023-04-06
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多