2

我正在尝试运行位于公司代理后面的 Chrome 无头浏览器。我试过下面的代码。但无法通过它。

public class HeadlessChrome 
{
    WebDriver driver;

    @Test
    public void createChromeDriverHeadless() throws InterruptedException
    {
        System.setProperty("webdriver.chrome.driver", "D:\\LocalData\\workspace\\Drivers and Libraries\\driver\\chromedriver.exe");

        ChromeOptions chromeOptions = new ChromeOptions();

        Proxy proxy = new Proxy();
        proxy.setHttpProxy("http://user:pwd@server:port");
        proxy.setSslProxy("http://user:pwd@server:port");

//      chromeOptions.setCapability("proxy", proxy);
        chromeOptions.addArguments("--proxy-server=user:pwd@server:port");
        chromeOptions.addArguments("--headless");
        chromeOptions.addArguments("--disable-gpu");
        chromeOptions.addArguments("start-maximized");  

        driver = new ChromeDriver(chromeOptions);
        driver.get("http://seleniumhq.org");       

        Thread.sleep(5000);
        System.out.println("Title : " + driver.getTitle());
        assertTrue(driver.findElement(By.id("q")).isDisplayed());
        driver.quit();
    }
}

请帮帮我。

4

3 回答 3

4

如果您不使用headless,您可以使用以下链接中的方法

用户:使用 selenium 传递代理

但目前不允许使用无头扩展。所以现在你的选择是添加另一个代理

chrome -> (intermediate proxy w/o auth) -> corporate proxy w/ auth -> internet

一种选择是使用polipo

https://www.irif.fr/~jch/software/polipo/

使用以下配置

parentAuthCredentials=username:password
parentProxy=corporateproxy:port

然后使用

chromeOptions.addArguments("--proxy-server=http://polipoproxy:port");

默认设置为127.0.0.1:8123不要在 polipo 配置中覆盖。

您可以使用的其他选项

  • 使用 squid 代理而不是 polipo

  • 使用 python 或 node 或您喜欢的任何其他语言编写您自己的代理转发器

于 2018-06-21T07:32:00.247 回答
1

有与 Luminati 合作的名为 Linken-sphere 的无头浏览器。他们提供了一些不错的优惠。你应该检查一下。 https://miped.ru/f/threads/linken-sphere-antidetekt-brauzer-novogo-pokolenija.67098/

于 2018-10-10T19:49:21.510 回答
0

使用selenium 4(目前处于测试阶段)很容易实现。您可以通过多种方式做到这一点:

  1. 您基本上需要注册检查是否将凭据应用于任何授权请求。适用于基本和代理身份验证弹出窗口。

    ChromeDriver driver = new ChromeDriver(new ChromeOptions().setHeadless(true));
    String USER_NAME = "guest";
    String PASSWORD = "guest";
    //register our check here
    driver.register(UsernameAndPassword.of(USER_NAME, PASSWORD));
    driver.get("https://jigsaw.w3.org/HTTP/");
    //Click on the link to show an authentication popup
    driver.findElement(By.linkText("Basic Authentication test")).click();
    String msg = driver.findElement(By.tagName("html")).getText();
    assert msg.equalsIgnoreCase("Your browser made it!");
    
  2. 使用CDP 网络域。不适用于代理授权弹出窗口(例如,这里是puppeteer 中的类似问题,它归结为 chrome 项目)

    ChromeDriver driver = new ChromeDriver(new ChromeOptions().setHeadless(true));
    String USER_NAME = "guest";
    String PASSWORD = "guest";
    
    DevTools devTools = driver.getDevTools();
    //create a cdp session
    devTools.createSession();
    //enable network first
    devTools.send(Network.enable(Optional.empty(), Optional.empty(), Optional.empty()));
    //Open website
    driver.get("https://jigsaw.w3.org/HTTP/");
    //Create and send the authorization header
    Map<String, Object> headers = new HashMap<>();
    String basicAuth = "Basic " + new String(Base64.getEncoder().encode(String.format("%s:%s", USER_NAME, PASSWORD).getBytes()));
    headers.put("Authorization", basicAuth);
    devTools.send(Network.setExtraHTTPHeaders(new Headers(headers)));
    //Click on the link to show an authentication popup
    driver.findElement(By.linkText("Basic Authentication test")).click();
    String msg = driver.findElement(By.tagName("html")).getText();
    assert msg.equalsIgnoreCase("Your browser made it!");
    
  3. 使用CDP 获取域。适用于基本和代理身份验证弹出窗口。

    ChromeDriver driver = new ChromeDriver(new ChromeOptions().setHeadless(true));
    String USER_NAME = "guest";
    String PASSWORD = "guest";
    
    DevTools devTools = driver.getDevTools();
    //create a cdp session
    devTools.createSession();
    //enable Fetch first
    devTools.send(Fetch.enable(Optional.empty(), Optional.of(true)));
    devTools.addListener(Fetch.requestPaused(), requestPaused -> devTools.send(Fetch.continueRequest(requestPaused.getRequestId(), Optional.empty(), Optional.empty(), Optional.empty(), Optional.empty())));
    devTools.addListener(Fetch.authRequired(), authRequired -> devTools.send(Fetch.continueWithAuth(authRequired.getRequestId(), new AuthChallengeResponse(PROVIDECREDENTIALS, Optional.of(USER_NAME), Optional.of(PASSWORD)))));
    
    //Open website
    driver.get("https://jigsaw.w3.org/HTTP/");
    //Click on the link to show an authentication popup
    driver.findElement(By.linkText("Basic Authentication test")).click();
    String msg = driver.findElement(By.tagName("html")).getText();
    assert msg.equalsIgnoreCase("Your browser made it!");
    
于 2021-04-29T16:35:38.590 回答