Java - логика распределенных объектов: сервер как хранилище / клиент как работник - PullRequest
1 голос
/ 04 апреля 2019

TL; DR : у меня есть требование для распределения бизнес-логики во время выполнения между сервером и несколькими удаленными клиентами, использующими Selenium WebDriver.

Я рассмотрел сериализацию объектов, RMI, загрузку JAR-файлов на лету, Selenese через Java и Selenium Grid.


Сведения : Ожидается, что несколько удаленных клиентов будут опрашивать очередь через JMS через Интернет, чтобы получить ордер на выполнение определенной работы на данном веб-сайте. Каждый клиент будет запускать Selenium WebDriver, проходить через этот веб-сайт способом, который не является предопределенным (или только в очень абстрактных терминах) до времени выполнения клиента , затем возвращаться к опросу очереди до повторного вызова.

Сложность заключается в том, что ни веб-сайт, ни точные шаги обхода не будут заранее известны клиенту. Я могу заранее определить абстрактные шаги / методы на сервере , но клиент будет зависеть от каких-то загруженных данных для точного получения списка команд Selenium. На этих шагах также необходимо выполнить цикл (repeat until...).

Например, если мы определим void login() для example1.com:

  1. Щелкните поле 'username'
  2. Отправить ключи 'username'
  3. Щелкните поле «Пароль»
  4. Отправить ключи «пароль»
  5. Нажмите «отправить»

Принимая во внимание, например, example2.com void login() будет:

  1. Нажмите на кнопку «Войти»
  2. Дождаться появления поля 'username'
  3. Щелкните поле 'username'
  4. Нажмите «Продолжить»
  5. и т.д.

исследуемый

  • Сериализация : будут передавать только переменные объекта, но не логику объекта.
  • RMI : Логика объекта выполняется на сервере, а не на клиенте, поэтому она не может взаимодействовать с экземпляром Selenium клиента.
  • Загрузка файлов JAR на лету : возможные решения здесь и менее оптимистично здесь . Это реалистично?
  • Selenese : Вероятно, не может быть запущен непосредственно под Java. Может быть возможно с selenese-runner-java , но это, похоже, только для командной строки, что ограничивает взаимодействие с клиентским программным обеспечением и, следовательно, функциональность
  • Selenium Grid : узел (клиент) должен быть постоянно подключен к концентратору (серверу), что не может быть гарантировано

Как я могу таким образом распространять бизнес-логику от сервера к клиенту во время выполнения?

1 Ответ

1 голос
/ 04 апреля 2019

Вы можете объявить интерфейс SeleniumRunner с помощью общего метода Selenium run.

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 своим клиентам и загружать их во время выполнения, как описано во второй ссылке Как динамически загружать JAR во время выполнения.Здесь вам также понадобится интерфейс.В противном случае ваше решение будет содержать много размышлений и дополнительных настроек конфигурации, чтобы найти и использовать правильные методы, содержащие вашу логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...