Java-分布式对象逻辑:服务器作为存储/客户端作为工作器

时间:2019-04-04 15:03:29

标签: java selenium selenium-webdriver

TL; DR :我需要在运行时在服务器和运行Selenium WebDriver的多个远程客户端之间分发业务逻辑。

我研究了对象序列化,RMI,通过Java和Selenium Grid即时下载JAR,Selenese。


详细信息:预计多个远程客户端将通过Internet上的JMS轮询队列,以获取订单以在给定的网站上进行某些工作。每个客户端将启动Selenium WebDriver,以客户端运行时之前未预先定义的方式(或仅非常抽象的方式)遍历该网站,然后返回轮询队列直到再次调用

挑战在于,网站和确切的遍历步骤都不会提前告知客户。我可以预先在服务器上定义抽象步骤/方法,但是客户端将依赖某种下载的数据来精确获取Selenium命令列表。这些步骤(repeat until...)中还需要一些循环。

例如,如果我们为example1.com定义void login()

  1. 点击“用户名”字段
  2. 发送密钥“用户名”
  3. 点击“密码”字段
  4. 发送密钥“密码”
  5. 点击“提交”

例如example2.com void login()为:

  1. 点击“登录”框
  2. 等待“用户名”字段出现
  3. 点击“用户名”字段
  4. 点击“继续”

已研究

  • 序列化:将仅传输对象变量,而不传输对象逻辑。
  • RMI :对象逻辑是在服务器而不是客户端上执行的,因此它无法与客户端的Selenium实例进行交互。
  • 即时下载JAR :可能的解决方案here,而不太乐观的here。这些现实吗?
  • :可能无法直接在Java下运行。 selenese-runner-java可能是可行的,但这似乎仅是命令行,这将限制与客户端软件的交互并因此限制功能
  • Selenium Grid :必须始终将节点(客户端)连接到集线器(服务器)

如何在运行时以这种方式将业务逻辑从服务器分发到客户端?

1 个答案:

答案 0 :(得分:1)

您可以使用通用的Selenium运行方法声明接口SeleniumRunner

public void runSelenium(WebDriver driver);

How to provide an interface to JavaCompiler when compiling a source file dynamically?中所述,您可以将源文件传输到客户端并在运行时对其进行编译。该类必须实现上述接口。

File sourceFile = new File("SeleniumClass1234.java");
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
compiler.run(null, null, null, sourceFile.getPath());
...

SeleniumRunner sr = (SeleniumRunner) Class.forName("SeleniumClass1234").newInstance();
sr.runSelenium(driver);

或者,您也可以按照第二个链接How should I load Jars dynamically at runtime?中所述,将jar文件传输到客户端并在运行时加载它们。您还将在这里需要该接口。否则,您的解决方案将包含很多反思和其他配置设置,以查找和使用包含您的逻辑的正确方法。