首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >程控SauceLabs隧道控制

程控SauceLabs隧道控制
EN

Stack Overflow用户
提问于 2015-11-23 20:01:02
回答 2查看 806关注 0票数 1

有人有用编程方式控制SauceLabs SauceConnect隧道以进行Selenium WebDriver测试的经验吗?特别是在Java代码中。SauceLabs文档中的示例假设隧道是在执行测试之前手动创建的,或者在所有测试使用的某个地方都有一个永久隧道。

隧道需要对每个测试都是唯一的,并且支持在同一个盒子上同时运行多个隧道/测试。使用该项目的任何人都应该能够使用隧道执行测试,而无需手动步骤来创建隧道或执行隧道软件的特殊安装和配置。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-14 04:18:08

我做了一些研究,并想出了一种从代码中控制我的SauceConnect隧道的方法。这是一个简单的总结,如何让它发挥作用,以防其他人想要这样做。我使用此设置在同一服务器上运行多个隧道,并将每个隧道绑定到现场代理服务器。这些示例假设您正在JVM上运行代码。

我在博客上写了一篇更详细的控制酱油连接文章。

依赖关系

将下列依赖项添加到项目中。com.saucelabs.ci-sauce

然后,您可以调用库,使用下面的代码启动和停止隧道。

启动隧道

代码语言:javascript
运行
复制
Process tunnel = sauceTunnelManager.openConnection( 
        sauceUser,      // username 
        sauceKey,       // apiKey 
        port,           // port 
        null,           // sauceConnectJar 
        tunnelOptions,  // Tunnel options 
        null,           // printStream 
        null,           // verboseLogging 
        null            // sauceConnectPath );

封闭隧道

代码语言:javascript
运行
复制
sauceTunnelManager.closeTunnelsForPlan(
     sauceUser,      // username (same as start tunnel)
     tunnelOptions,  // tunnelOptions (same as start tunnel)
     null);
票数 2
EN

Stack Overflow用户

发布于 2017-11-20 05:06:57

下面是我编写的一系列以编程方式控制SauceTunnel的java类,这些类是使用户能够使用JUnit与BrowserStack或SauceLabs对话的更广泛解决方案的一部分:

存储库有一个lib目录,其中包含Sauce-Connect.jar。

SauceLabsTunnel

代码语言:javascript
运行
复制
package au.com.somecompany.devops.tunnels;

import au.com.somecompany.devops.tunnels.channel.Channel;
import au.com.somecompany.devops.tunnels.channel.SauceLabsChannel;
import au.com.somecompany.devops.utils.Drop;

public class SauceLabsTunnel extends Thread implements Runnable {
    private Channel Jar;
    private Drop Tunnelled;
    private Drop Tested;

    public SauceLabsTunnel(Drop tunnelled, Drop tested){
        String command = "java -jar lib/Sauce-Connect.jar ";
        String successMessage = "Successful handshake with Sauce Connect server";
        String failureMessage = "Could not reach Sauce Labs REST API";
        String outputTerminal = "Connected! You may start your tests.";

        Jar = new SauceLabsChannel(command, System.getProperty("ACCESSKEY"), successMessage, failureMessage, outputTerminal, System.getProperty("USERNAME"));
        Tunnelled = tunnelled;
        Tested = tested;
    }

    @Override
    public void run() {
        Jar.Launch();

        while(!Jar.IsJARSuccessfullyLaunched()){
            Jar.Launch();
        }
        Jar.PrintOutput();
        Tunnelled.put("TUNNELLED");

        for (String message = Tested.take(); !message.equals("TESTED"); message = Tested.take()) {
            System.out.println("I see Testing is completed. Closing Tunnel...");
        }
        Shutdown();
    }

    public void Shutdown(){
        Jar.Shutdown();
    }
}

信道

代码语言:javascript
运行
复制
package au.com.somecompany.devops.tunnels.channel;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Channel {
    protected Process Process;
    protected String ChannelCommand = null;
    protected String ProcessOutput = null;
    protected String SuccessMessage = null;
    protected String FailureMessage = null;
    protected String OutputTerminal = null;

    public Channel(String command, String successMessage, String failureMessage, String outputTerminal){
        ChannelCommand = command;
        SuccessMessage = successMessage;
        FailureMessage = failureMessage;
        OutputTerminal = outputTerminal;
    }

    public void Launch(){
        Process = ExecuteJAR();
        ProcessOutput = GetOutput(Process.getInputStream());
    }

    public boolean IsJARSuccessfullyLaunched(){
        return ProcessOutput.contains(SuccessMessage) && 
               !ProcessOutput.contains(FailureMessage);
    }

    public void PrintOutput(){
        System.out.print(ProcessOutput);
    }

    public void Shutdown(){
        Process.destroy();
    }

    private String GetOutput(InputStream is){
        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        StringBuffer sb = new StringBuffer();
        try {
            String s = br.readLine();
            if(s == null) {
                return null;
            }
            while(!s.contains(OutputTerminal)){
                sb.append(s).append("\n");
                s = br.readLine();
                if(s == null || s.contains(OutputTerminal)){
                    break;
                }
            }
        } catch (IOException e){
            e.printStackTrace();
        }
        return sb.toString();
    }

    private Process ExecuteJAR() {
        Process p;
        try {
            p = Runtime.getRuntime().exec(ChannelCommand);
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return p;
    }
}

SauceLabsChannel

代码语言:javascript
运行
复制
package au.com.somecompany.devops.tunnels.channel;

public class SauceLabsChannel extends Channel {
    public SauceLabsChannel(String command, String accessKey, String successMessage, String failureMessage, String outputTerminal, String username){
        super(command, successMessage, failureMessage, outputTerminal);
        ChannelCommand += username + " " + accessKey;
    }
}

液滴

代码语言:javascript
运行
复制
package au.com.somecompany.devops.utils;

public class Drop {
    // Message sent from producer
    // to consumer.
    private String message;
    // True if consumer should wait
    // for producer to send message,
    // false if producer should wait for
    // consumer to retrieve message.
    private boolean empty = true;

    public synchronized String take() {
        // Wait until message is
        // available.
        while (empty) {
            try {
                wait();
            } catch (InterruptedException e) {}
        }
        // Toggle status.
        empty = true;
        // Notify producer that
        // status has changed.
        notifyAll();
        return message;
    }

    public synchronized void put(String message) {
        // Wait until message has
        // been retrieved.
        while (!empty) {
            try { 
                wait();
            } catch (InterruptedException e) {}
        }
        // Toggle status.
        empty = false;
        // Store message.
        this.message = message;
        // Notify consumer that status
        // has changed.
        notifyAll();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33879622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档