barlop
barlop

Reputation: 13743

In ruby, I can't get byebug to work with selenium

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

Answers (2)

barlop
barlop

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

rs007
rs007

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

Related Questions