Reputation: 13743
require 'selenium-webdriver'
require 'byebug'
byebug
driver = Selenium::WebDriver.for:chrome
driver.navigate.to "http://google.com"
puts driver.find_element(:tag_name, 'input');
puts driver.find_element(:name, 'q');
driver.find_element(:name, 'q').send_keys("asdf");
#sleep 20
When I run the program, it goes straight to driver = Selenium::WebDriver.for:chrome
I hit 'n', then it loads Chrome, and goes to google and sends those keys into the input box and exits the program.
What I'd like to happen is that I hit 'n' it goes to driver.navigate.to "http://google.com"
. I hit 'n' again, it goes to puts driver.find_element(:tag_name, 'input');
. And I would like from the console to run commands like driver.find_element.... But I can't because byebug isn't tracing through the program after the driver = Selenium::WebDriver.for:chrome
line.
I want to be able to check out the DOM with Selenium from the console / irb / byebug
Added
A comment suggests using pry
So I tried require 'pry'
and binding.pry
. And 'next' rather than 'n'(as pry uses 'next'). Same problem.
And I tried require 'pry-byebug'
and 'binding.pry'
and 'next' rather than 'n'(as pry-byebug uses 'next'). Also same problem.
On rs's suggestion, I tried require 'pry'
and require 'pry-byebug'
and binding.pry(to halt). And tried step
rather than next
. Also, same problem. I have now added output of this.
Added Further
Apples-MBP:rubyselenium1 apple$ cat selenium12.rb
# https://stackoverflow.com/questions/53962313/in-ruby-i-cant-get-byebug-to-work-with-selenium?noredirect=1#comment94763217_53962313
require 'selenium-webdriver'
require 'pry'
require 'pry-byebug'
binding.pry
driver = Selenium::WebDriver.for:chrome
driver.navigate.to "http://google.com"
puts driver.find_element(:tag_name, 'input');
puts driver.find_element(:name, 'q');
driver.find_element(:name, 'q').send_keys("asdf");
#sleep 20
Apples-MBP:rubyselenium1 apple$ ruby selenium12.rb
WARN: Unresolved specs during Gem::Specification.reset:
ffi (>= 1.0.11, ~> 1.0)
WARN: Clearing out unresolved specs.
Please report a bug if this causes problems.
From: /Users/apple/rubyselenium1/selenium12.rb @ line 9 :
4: require 'pry'
5: require 'pry-byebug'
6:
7: binding.pry
8:
=> 9: driver = Selenium::WebDriver.for:chrome
10:
11: driver.navigate.to "http://google.com"
12:
13: puts driver.find_element(:tag_name, 'input');
14: puts driver.find_element(:name, 'q');
[1] pry(main)> step
From: /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver.rb @ line 86 Selenium::WebDriver.for:
85: def self.for(*args)
=> 86: WebDriver::Driver.for(*args)
87: end
[1] pry(Selenium::WebDriver)> step
From: /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/driver.rb @ line 42 Selenium::WebDriver::Driver.for:
41: def for(browser, opts = {})
=> 42: case browser
43: when :chrome
44: Chrome::Driver.new(opts)
45: when :internet_explorer, :ie
46: IE::Driver.new(opts)
47: when :safari
48: Safari::Driver.new(opts)
49: when :phantomjs
50: PhantomJS::Driver.new(opts)
51: when :firefox, :ff
52: Firefox::Driver.new(opts)
53: when :edge
54: Edge::Driver.new(opts)
55: when :remote
56: Remote::Driver.new(opts)
57: else
58: raise ArgumentError, "unknown driver: #{browser.inspect}"
59: end
60: end
[1] pry(Selenium::WebDriver::Driver)> step
From: /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/driver.rb @ line 44 Selenium::WebDriver::Driver.for:
41: def for(browser, opts = {})
42: case browser
43: when :chrome
=> 44: Chrome::Driver.new(opts)
45: when :internet_explorer, :ie
46: IE::Driver.new(opts)
47: when :safari
48: Safari::Driver.new(opts)
49: when :phantomjs
50: PhantomJS::Driver.new(opts)
51: when :firefox, :ff
52: Firefox::Driver.new(opts)
53: when :edge
54: Edge::Driver.new(opts)
55: when :remote
56: Remote::Driver.new(opts)
57: else
58: raise ArgumentError, "unknown driver: #{browser.inspect}"
59: end
60: end
[1] pry(Selenium::WebDriver::Driver)> step
From: /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb @ line 40 Kernel#require:
35: #
36: # The normal <tt>require</tt> functionality of returning false if
37: # that file has already been loaded is preserved.
38:
39: def require path
=> 40: RUBYGEMS_ACTIVATION_MONITOR.enter
41:
42: path = path.to_path if path.respond_to? :to_path
43:
44: if spec = Gem.find_unresolved_default_spec(path)
45: Gem.remove_unresolved_default_spec(spec)
[1] pry(main)> step
From: /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/monitor.rb @ line 184 MonitorMixin#mon_enter:
183: def mon_enter
=> 184: if @mon_owner != Thread.current
185: @mon_mutex.lock
186: @mon_owner = Thread.current
187: @mon_count = 0
188: end
189: @mon_count += 1
190: end
[1] pry(#<Monitor>)> step
From: /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/monitor.rb @ line 185 MonitorMixin#mon_enter:
183: def mon_enter
184: if @mon_owner != Thread.current
=> 185: @mon_mutex.lock
186: @mon_owner = Thread.current
187: @mon_count = 0
188: end
189: @mon_count += 1
190: end
[1] pry(#<Monitor>)> step
before_session hook failed: ThreadError: deadlock; recursive locking
/usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/monitor.rb:185:in `lock'
(see _pry_.hooks.errors to debug)
[1] pry(#<Monitor>)>
Traceback (most recent call last):
29: from selenium12.rb:9:in `<main>'
28: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver.rb:86:in `for'
27: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/common/driver.rb:44:in `for'
26: from /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:40:in `require'
25: from /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/monitor.rb:186:in `mon_enter'
24: from /usr/local/lib/ruby/gems/2.5.0/gems/byebug-10.0.2/lib/byebug/context.rb:98:in `at_line'
23: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:63:in `at_line'
22: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:111:in `resume_pry'
21: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:27:in `run'
20: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:27:in `catch'
19: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:28:in `block in run'
18: from /usr/local/lib/ruby/gems/2.5.0/gems/byebug-10.0.2/lib/byebug/helpers/eval.rb:94:in `allowing_other_threads'
17: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:28:in `block (2 levels) in run'
16: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-byebug-3.6.0/lib/byebug/processors/pry_processor.rb:113:in `block in resume_pry'
15: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/pry_instance.rb:348:in `repl'
14: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/repl.rb:38:in `start'
13: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/input_lock.rb:79:in `with_ownership'
12: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/input_lock.rb:61:in `__with_ownership'
11: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/repl.rb:38:in `block in start'
10: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/repl.rb:67:in `repl'
9: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/repl.rb:67:in `loop'
8: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/repl.rb:68:in `block in repl'
7: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/repl.rb:108:in `read'
6: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/indent.rb:394:in `correct_indentation'
5: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/terminal.rb:8:in `screen_size'
4: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/terminal.rb:33:in `actual_screen_size'
3: from /usr/local/lib/ruby/gems/2.5.0/gems/pry-0.11.3/lib/pry/terminal.rb:47:in `screen_size_according_to_io_console'
2: from /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/rubygems/core_ext/kernel_require.rb:40:in `require'
1: from /usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/monitor.rb:185:in `mon_enter'
/usr/local/Cellar/ruby/2.5.0/lib/ruby/2.5.0/monitor.rb:185:in `lock': deadlock; recursive locking (ThreadError)
Apples-MBP:rubyselenium1 apple$
Apples-MBP:rubyselenium1 apple$
Upvotes: 0
Views: 535
Reputation: 13743
The following is a partial answer. It doesn't solve the pry / byebug / pry-byebug issue, but it does address this part,
One of the things the question asks is
"I want to be able to check out the DOM with Selenium from the console / irb / byebug"
Code using Selenium does run OK typed straight into irb
$ irb
irb(main):001:0> require 'selenium-webdriver'
=> true
irb(main):011:0> driver = Selenium::WebDriver.for:firefox
=> #<Selenium::WebDriver::Firefox::Marionette::Driver:0x..fcead308af2433ac2 browser=:firefox>
irb(main):013:0> driver.navigate().to("http://www.google.com")
=> nil
irb(main):036:0> inps=driver.find_elements(:tag_name, "input");
=> [#<Selenium::WebDriver::Element:0x..f8ed35db92a849eea id="dac....
irb(main):041:0> inps[2].attribute('name');
=> "q"
irb(main):042:0> inps[2].attribute('value');
=> "" <-- shows whatever is typed in that google search box eg prior to checking the value we could've typed something e.g. 'asdf' into it manually or programmatically eg driver.find_element(:tag_name, "input").send_keys("asdf"); and it will show "asdf".
Upvotes: 0
Reputation: 445
This gem "Adds step-by-step debugging and stack navigation capabilities to pry using byebug." {quoted from pry-byebug}, So you need pry and byebug both inorder to use pry byebug. So ensure both gems are installed: you can add both gems to your GemFile and do bundle install
or just do that directly, after that you should require both and then add binding.pry
execution will stop at the first statment after that.
"The aliases 'n', 's', 'c' and 'f'
were removed by default because they usually conflict with scratch variable names. But it's very easy to reenable them if you still want them, just add the following shortcuts to your ~/.pryrc file:"
if defined?(PryByebug)
Pry.commands.alias_command 'c', 'continue'
Pry.commands.alias_command 's', 'step'
Pry.commands.alias_command 'n', 'next'
Pry.commands.alias_command 'f', 'finish'
end
More detailed info in the link i provided above, hope this helps.
added by barlop
rs comments that questioner try require pry
and require pry-byebug
and halt with binding.pry
Upvotes: 0