DRuby с Selenium WebDriver

Я использую распределенный рубин, чтобы сохранить объект веб-драйвера selenium в одном сценарии и использовать тот же объект в следующем сценарии, когда я запускаю клиентов, я получаю сообщение об ошибке, указывающее, что #<Drb::DRbConnError: соединение закрыто>.

Кто-нибудь пробовал это или как решить эту проблему?

Ниже мои скрипты

Server.rb

      require 'drb/drb'

# The URI for the server to connect to
URI="druby://localhost:8787"

# Allows sharing of variables between component runs
class TestScope
  # class variable
  @@variables = {}

  def save_variable(key, value)
      @@variables.store(key, value)
  end

  def get_variable(key)
    return @@variables[key]
  end

  def get_size
    return @@variables.size
  end 
end

# The object that handles requests on the server
FRONT_OBJECT=TestScope.new

DRb.start_service(URI, FRONT_OBJECT, safe_level: 1, verbose: true)
# Wait for the drb server thread to finish before exiting.
DRb.thread.join

Client1.rb

      require 'drb/drb'
require 'selenium-webdriver'

# The URI to connect to
SERVER_URI="druby://localhost:8787"

# Start a local DRbServer to handle callbacks.

# Not necessary for this small example, but will be required
# as soon as we pass a non-marshallable object as an argument
# to a dRuby call.

# Note: this must be called at least once per process to take any effect.
# This is particularly important if your application forks.
DRb.start_service

test_scope = DRbObject.new_with_uri(SERVER_URI)

driver = Selenium::WebDriver::Driver.for :firefox
driver.navigate.to "http://www.google.com"

puts "Saving the driver object to the test scope"
test_scope.save_variable('driver', driver)

Client2.rb

      require 'drb/drb'
require 'selenium-webdriver'

# The URI to connect to
SERVER_URI="druby://localhost:8787"

# Start a local DRbServer to handle callbacks.

# Not necessary for this small example, but will be required
# as soon as we pass a non-marshallable object as an argument
# to a dRuby call.

# Note: this must be called at least once per process to take any effect.
# This is particularly important if your application forks.
DRb.start_service

test_scope = DRbObject.new_with_uri(SERVER_URI)

puts "Fetching the driver object from the test scope"
driver1 = test_scope.get_variable('driver')
driver1.navigate.to "http://www.yahoo.com"

1 ответ

Чтобы совместно использовать объект с помощью DRb, класс должен быть определен на сервере dRb, поскольку он позволяет объекту в одном процессе Ruby вызывать методы объекта в другом процессе Ruby на том же или другом компьютере.

Если есть сценарий, в котором нужно создать объект на клиенте dRb и использовать этот объект в других клиентах DRb. Нам нужно использовать ruby ​​script runner и определить объект в scriptrunner.rb, чтобы несколько клиентов могли его использовать.

Другие вопросы по тегам