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

问题描述 投票:1回答:1

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

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


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

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

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

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

鉴于example2.com void login()将是:

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

研究:

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

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

java selenium selenium-webdriver
1个回答
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);

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

© www.soinside.com 2019 - 2024. All rights reserved.