TL; DR:我需要在服务器和运行Selenium WebDriver的多个远程客户端之间在运行时分发业务逻辑。
我查看了对象序列化,RMI,即时下载JAR,Selenese通过Java和Selenium Grid。
详细信息:预计多个远程客户端将通过Internet通过JMS轮询队列,以获取要在给定网站上执行某些操作的订单。每个客户端都将启动Selenium WebDriver,以在客户端运行时之前未预定义(或仅以非常抽象的术语)的方式遍历该网站,然后返回轮询队列直到再次调用。
挑战在于,网站和精确的遍历步骤都不会提前为客户所知。我可以在服务器上预先定义抽象步骤/方法,但客户端将依赖于某种下载数据来精确获取Selenium命令列表。这些步骤中还需要一些循环(repeat until...
)。
例如,如果我们为example1.com定义void login()
:
鉴于example2.com void login()
将是:
研究:
如何以这种方式在运行时将业务逻辑从服务器分发到客户端?
您可以使用类似的通用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?中所述。您也需要这里的界面。否则,您的解决方案将包含大量反射和其他配置设置,以查找和使用包含您的逻辑的正确方法。