java - 用于基于云的测试的独立与嵌入式 Browsermob 代理 (Sauce Labs/Browserstack)

标签 java selenium-webdriver saucelabs browserstack browsermob-proxy

我在本地使用嵌入式 Browsermob 代理服务器进行了工作测试。没有什么新东西,但这里仍然是示例代码。

    _server = new BrowserMobProxyServer()
    _server.start();
    Proxy proxy = ClientUtil.createSeleniumProxy(_server);
    ChromeOptions options = new ChromeOptions();
    options.setCapability("proxy", proxy);
    _driver = new ChromeDriver(options);

现在我们正在研究将此类测试集成到我们的 CI 管道中并在云中执行这些测试的选项 (Browserstack/Sauce Labs)。我试图弄清楚在这种情况下设置会是什么样子。现在我的理解是代码(设置代理并实际包含测试)将在我们的服务器上运行。这意味着嵌入式代理也将在我们的服务器上运行不一定可以从外部访问。所以问题是:

  1. 我是否必须切换到独立的 browsermob 代理并使其可访问?
  2. 如果是,那么是否有任何从代码中使用独立代理的实际代码示例? (这个选项看起来并不特别吸引人,因为我们必须编写样板代码来包装 REST API)
  3. 如果不是,那么我假设远程 Selenium Webdriver 将通过隧道(Sauce Connect 等)通过新设置的嵌入式代理连接到被测网站是否正确?
  4. 将 Browsermob 与 CI 服务器与基于云的测试平台结合使用的最佳实践是什么?

最佳答案

如果 test/webdriver 实例将在您的情况下在远程机器(browserstack 或 sauce)上运行,则必须在远程机器上对代理服务器生成的代理进行身份验证以拦截流量。我有类似的要求,我使用独立的 BrowserMob 实例进行设置。下面是 browserstack 的工作示例代码及其本地测试二进制文件:

这将需要以下依赖项:

<dependency>
    <groupId>com.browserstack</groupId>
    <artifactId>browserstack-local-java</artifactId>
    <version>1.0.0</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>net.lightbody.bmp</groupId>
    <artifactId>browsermob-core</artifactId>
    <version>2.1.5</version>
    <scope>test</scope>
</dependency> 

代码片段:

import com.browserstack.local.Local;
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.CaptureType;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;

import java.io.File;
import java.net.URL;
import java.util.HashMap;

public class InterceptProxy {
    public static final String USERNAME = <BrowserStack Username>;
    public static final String AUTOMATE_KEY = <BrowserStack Key>;
    public static final String URL = "https://" + USERNAME + ":" + AUTOMATE_KEY + "@hub-cloud.browserstack.com/wd/hub";

    public static void main(String[] args) throws Exception {
        BrowserMobProxy proxy = new BrowserMobProxyServer();
        proxy.start(0);
        Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
        Local browserStackLocal = new Local();
        HashMap<String, String> browserStackLocalArgs = new HashMap<String, String>();
        browserStackLocalArgs.put("key", AUTOMATE_KEY);
        browserStackLocalArgs.put("forcelocal", "true");
        browserStackLocalArgs.put("forceproxy","true");
        browserStackLocalArgs.put("force","true");
        browserStackLocalArgs.put("v", "true");
        String host=seleniumProxy.getHttpProxy().substring(0,seleniumProxy.getHttpProxy().indexOf(":"));
        String port=seleniumProxy.getHttpProxy().substring(seleniumProxy.getHttpProxy().indexOf(":")+1,seleniumProxy.getHttpProxy().length());
        browserStackLocalArgs.put("-local-proxy-host", host);
        browserStackLocalArgs.put("-local-proxy-port", port);
        browserStackLocal.start(browserStackLocalArgs);

        DesiredCapabilities caps = new DesiredCapabilities();
        caps.setCapability("browser", "Chrome");
        caps.setCapability("browser_version", "62.0");
        caps.setCapability("os", "Windows");
        //caps.setCapability(CapabilityType.PROXY, seleniumProxy);
        caps.setCapability("os_version", "10");
        caps.setCapability("browserstack.local",true);

        WebDriver driver = new RemoteWebDriver(new URL(URL), caps);
        driver.manage().deleteAllCookies();
        driver.manage().window().maximize();
        proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);

        // create a new HAR with the label "yahoo.com"
        proxy.newHar("yahoo.com");

        // open yahoo.com
        driver.get("http://yahoo.com");

        // get the HAR data
        Har har = proxy.getHar();

        //Writing Har to file
        har.writeTo(new File("/Users/MyUser/Desktop/HAR.txt"));
        driver.quit();
        browserStackLocal.stop();
        proxy.stop();
    }
}

关于java - 用于基于云的测试的独立与嵌入式 Browsermob 代理 (Sauce Labs/Browserstack),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48997684/

相关文章:

java - 有没有办法将流数据检索与 hibernate 结合起来?

python - (Python, Selenium) 是否只有属性满足条件才能获取文本列表?

java - 如何在 Saucelabs 中上传一次文件并将其用于其他测试

selenium-chromedriver - appium chrome浏览器的文件下载权限

java - 使用java中的方法限制进行安全发布

带有方法的java库存检查器

java - Math.ceil 不舍入值

javascript - 无法使用WebElement Nodejs

java - 如何从知道其值的单元格地址中捕获@id - Webdriver java

linux - Saucelabs 连接 Linux - 无法识别 '-u' 命令