【问题标题】:How to set Proxy Authentication in seleniumWebdriver for Chrome Browser如何在 Chrome 浏览器的 selenium Webdriver 中设置代理身份验证
【发布时间】:2017-12-09 23:36:04
【问题描述】:

我正在尝试自动化 Web 应用程序 selenium 2.0 [webdriver+java]。Web 应用程序当前部署在我们本地网络上的 UAT 服务器中。我的测试用例正在执行,但我必须手动输入代理身份验证在测试执行开始时我的 Chrome 实例的详细信息。我已经尝试了堆栈溢出提供的所有解决方案,但仍然会弹出身份验证消息。

这是我在驱动程序初始化过程中使用的代码

包 com.misyn.ess.ui;

import java.util.Arrays;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

/**
 *
 * @author User
 */
public class DriverClass {

    private String baseUrl;
    private String driverPath;
    private String driverName;
    private static WebDriver driver;
    private static DriverClass driverClass;

        private DriverClass() {
            try {
                baseUrl = "http://192.168.0.10:8282/ess";
                driverPath = "E:\\Work_Folder\\SelTools\\chromedriver.exe";
                driverName = "webdriver.chrome.driver";

                //Set the location of the ChromeDriver
            System.setProperty(driverName, driverPath);
            //Create a new desired capability
            DesiredCapabilities capabilities = DesiredCapabilities.chrome();
            // Create a new proxy object and set the proxy
            Proxy proxy = new Proxy();
            proxy.setHttpProxy("192.168.0.200:3128");
            proxy.setSocksUsername("avishka");
            proxy.setSocksPassword("12345678");
            //Add the proxy to our capabilities 
            capabilities.setCapability("proxy", proxy);
            //Start a new ChromeDriver using the capabilities object we created and added the proxy to
            driver = new ChromeDriver(capabilities);

            //Navigation to a url and a look at the traffic logged in fiddler
            driver.navigate().to(baseUrl);


    //            System.setProperty(driverName, driverPath);
    //            driver = new ChromeDriver();
    //            driver.get(baseUrl);

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

谁能给我一个解决方案,如何从应用程序本身提供此代理用户名和密码,而不是在弹出窗口中手动输入详细信息(身份验证),任何帮助将不胜感激。谢谢

当前回答的只是为了

从 Selenium 3.4 开始,它仍处于测试阶段 目前仅针对 InternetExplorerDriver 进行实施

我使用 selenium 3.0 和 Google Chrome 作为我的网络浏览器。

【问题讨论】:

  • 您使用的是哪个 chrome 版本?
  • 版本 59.0.3071.115(官方版本)(64 位)@santhoshkumar
  • 那我觉得我们需要使用AUTOIT工具
  • 什么是AUTOIT工具
  • 任何代码或教程如何使用它进行代理身份验证@santhoshkumar

标签: java selenium selenium-webdriver webdriver qa


【解决方案1】:

您可以通过MultiPass for HTTP basic authentication进行操作


https://chrome.google.com/webstore/detail/multipass-for-http-basic/enhldmjbphoeibbpdhmjkchohnidgnah下载扩展程序

将扩展下载为 crx。您可以从chrome-extension-downloader获取它作为crx

之后配置就很简单了。

import java.io.File;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

/**
 *
 * @author Phystem
 */
public class ChromeAuthTest {

    WebDriver driver;

    public ChromeAuthTest() {
        System.setProperty("webdriver.chrome.driver", "chromedriver.exe");
    }

    private void initDriver() {
        ChromeOptions cOptions = new ChromeOptions();
        cOptions.addExtensions(new File("MultiPass-for-HTTP-basic-authentication_v.crx"));
        driver = new ChromeDriver(cOptions);
        configureAuth(
                "https://the-internet.herokuapp.com/basic_auth",
                "admin",
                "admin");
    }

    private void configureAuth(String url, String username, String password) {
        driver.get("chrome-extension://enhldmjbphoeibbpdhmjkchohnidgnah/options.html");
        driver.findElement(By.id("url")).sendKeys(url);
        driver.findElement(By.id("username")).sendKeys(username);
        driver.findElement(By.id("password")).sendKeys(password);
        driver.findElement(By.className("credential-form-submit")).click();
    }

    public void doTest() {
        initDriver();
        driver.get("https://the-internet.herokuapp.com/basic_auth");
        System.out.println(driver.getTitle());
        driver.quit();
    }

    public static void main(String[] args) {
        new ChromeAuthTest().doTest();
    }
}

我使用sample site 进行测试。

在配置身份验证功能中提供您的网址、用户名和密码并尝试

【讨论】:

  • 您是否通过直接连接尝试过此操作?
  • 我试图访问的应用程序是“192.168.0.10:8282/ess”,但我的代理身份验证弹出,来自网络代理“192.168.0.200:3128” . 我已经尝试过您的解决方案它在控制台java.lang.IllegalArgumentException: C:\Users\User\Documents\NetBeansProjects\Ess\MultiPass-for-HTTP-basic-authentication_v.crx does not exist 中显示了这一点,我在下面使用了 configureAuth()
  • 你必须下载crx文件..你做到了吗?
  • 是的,我有。来自 chrome 网上商店。它也作为扩展在我的 Chrome 浏览器上运行。
  • 您必须使用chrome extension downloader并将其下载为crx文件。
【解决方案2】:
    public class DriverClass {

    private String baseUrl;
    private String driverPath;
    private String driverName;
    private static WebDriver driver;
    private static DriverClass driverClass;

    public DriverClass() {
        try {
            baseUrl = "http://192.168.0.10:8282/ess";
            driverPath = "E:\\Work_Folder\\SelTools\\chromedriver.exe";
            driverName = "webdriver.chrome.driver";
            System.setProperty(driverName, driverPath);

            Proxy proxy = new org.openqa.selenium.Proxy();
            proxy.setSslProxy("192.168.0.200" + ":" + 3128);
            proxy.setFtpProxy("192.168.0.200" + ":" + 3128);
            proxy.setSocksUsername("avishka");
            proxy.setSocksPassword("12345678");

            DesiredCapabilities desiredCapabilities = DesiredCapabilities.chrome();
            desiredCapabilities.setCapability(CapabilityType.PROXY, proxy);


            driver = new ChromeDriver(desiredCapabilities);


            driver.get(baseUrl);


        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

代理设置已添加所需的功能,可以将值传递给代理身份验证,终于工作了

【讨论】:

  • @AndreyP 是您的项目使用互联网 css 文件、js 的资源吗?
【解决方案3】:

此代码(来自 Avishka Perera 的回答)对我不起作用:

    proxy.setSocksUsername("avishka");
    proxy.setSocksPassword("12345678");

这样设置的用户名和密码对http/https代理不生效——仍然弹出代理验证框。

我正在使用 Selenium java 3.141.0、ChromeDriver 2.33 和 chrome 70。对我有用的是在此处遵循 Mike 的回答 Selenium using Python: enter/provide http proxy password for firefox。 创建 zip 文件,然后像这样添加扩展名:

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.addExtensions(new File("src/test/resources/proxy.zip"));
WebDriver driver = new ChromeDriver(chromeOptions);

一个问题是如果你设置“--headless”参数,上面的代码会出错,因为无头模式下的chrome不能有扩展名(Is it possible to run Google Chrome in headless mode with extensions?)。如果您的 Chrome 在 Docker 容器中运行并且无法显示 UI,那么要使此解决方案正常工作,您需要使用 Xvfb 而不是无头模式运行。

【讨论】:

    【解决方案4】:

    在 firefox 和 chrome 中使用 selenium 线添加经过身份验证的代理的简单方法

    在python中

    步骤:1

    pip3 install selenium-wire
    

    步骤:2

    from seleniumwire import webdriver
    from selenium import webdriver
    

    步骤:3

    以下面提到的格式添加代理

    proxy= "username:password@ip:port"
            options = {'proxy': {'http': proxy, 'https': proxy, 'no_proxy': 'localhost,127.0.0.1,dev_server:8080'}}
    

    步骤:4 将代理作为参数传递

    driver = webdriver.Chrome(options=chrome_options, executable_path="path of chrome driver", seleniumwire_options=options)
    

    火狐

    driver = webdriver.Firefox(seleniumwire_options=options, executable_path="path of firefox driver", options=firefox_options)
    

    步骤:5 通过请求 url https://whatismyipaddress.com/验证代理应用

    time.sleep(20)
    driver.get("https://whatismyipaddress.com/")
    

    注意: 但是 selenium 日志显示它在没有代理的情况下运行,因为我们正在使用外部包来应用代理。

    【讨论】:

      【解决方案5】:

      对我来说非常有效的方法是使用 AutoIT。

      安装 autoIT 并准备一个简单的脚本,如附图所示,并在导航到 baseURL 之前使用 Runtime.getRuntime().exec("\YOUR_SCRIPT.exe") 从您的测试脚本执行脚本文件。

      【讨论】:

      • 尝试以不同的分辨率运行自动化。 AutoIT 无法识别必填字段。
      【解决方案6】:

      我知道这是一个旧线程,仍然留下一个使用 browsermob proxy 对我有用的解决方案,供仍然需要选择的人使用。

      Maven 依赖:

      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-java</artifactId>
          <version>4.0.0</version>
      </dependency>
      <dependency>
          <groupId>net.lightbody.bmp</groupId>
          <artifactId>browsermob-core</artifactId>
          <version>2.1.5</version>
      </dependency>
      

      Java 代码:

      // I am using firefox
      System.setProperty("webdriver.gecko.driver", "C:\\Selenium\\geckodriver.exe");
      
      BrowserMobProxy browsermobProxy = new BrowserMobProxyServer();
      browsermobProxy.setChainedProxy(new InetSocketAddress(PROXY_HOSTNAME, PROXY_PORT));
      browsermobProxy.chainedProxyAuthorization(PROXY_USERNAME, PROXY_PASSWORD, AuthType.BASIC);
      browsermobProxy.start(0);
      
      FirefoxBinary firefoxBinary = new FirefoxBinary();
      FirefoxOptions firefoxOptions = new FirefoxOptions();
      
      firefoxOptions.setBinary(firefoxBinary );
      firefoxOptions.setProfile(firefoxProfile);
      
      firefoxOptions.setProxy(ClientUtil.createSeleniumProxy(browsermobProxy));
      
      WebDriver webDriverWithProxy = new FirefoxDriver(firefoxOptionsWithProxy);
      
      webDriverWithProxy.get("https://stackoverflow.com/");
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-10
        • 1970-01-01
        • 2022-08-19
        • 2013-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多