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, чтобы несколько клиентов могли его использовать.