为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

HUWWW 2022-09-22 15:45:33

我需要在运行时在服务器和运行 Selenium Web 驱动程序的多个远程客户端之间分发业务逻辑。

我已经研究了对象序列化,RMI,动态下载JAR,通过Java和硒网格的硒化。


详细信息:预计多个远程客户端将通过互联网上的 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此处可能的解决方案,此处不太乐观。这些现实吗?

  • 硒:可能无法直接在 Java 下运行。使用硒运行器-java可能是可能的,但这似乎只是命令行,这将限制与客户端软件的交互,从而限制功能

  • 硒网格:节点(客户端)必须始终连接到集线器(服务器),这不能保证

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


查看完整描述

1 回答

?
隔江千里

TA贡献1561条经验 获得超10个赞

您可以使用通用的 Selenium 运行方法声明一个接口,如下所示。SeleniumRunner


public void runSelenium(WebDriver driver);

如在动态编译源文件时如何为 JavaCompiler 提供接口中所述,您可以将源文件传输到客户端并在运行时编译它们。该类必须实现上述接口。


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文件传输到客户端并在运行时加载它们,如第二个链接中所述,我应该如何在运行时动态加载Jars?。您还需要此处的界面。否则,您的解决方案将包含大量反射和其他配置设置,以查找和使用包含逻辑的正确方法。


查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信