Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中,使用selenium,很难单击Google搜索_Ruby_Selenium_Selenium Webdriver - Fatal编程技术网

在Ruby中,使用selenium,很难单击Google搜索

在Ruby中,使用selenium,很难单击Google搜索,ruby,selenium,selenium-webdriver,Ruby,Selenium,Selenium Webdriver,我走了这么远,打开firefox浏览器,导航到google,找到google搜索元素 irb(main):001:0> require 'selenium-webdriver' => true irb(main):002:0> driver = Selenium::WebDriver.for:firefox => #<Selenium::WebDriver::Firefox::Marionette::Driver:0x..fb3c81796cc82b708 bro

我走了这么远,打开firefox浏览器,导航到google,找到google搜索元素

irb(main):001:0> require 'selenium-webdriver'
=> true

irb(main):002:0> driver = Selenium::WebDriver.for:firefox
=> #<Selenium::WebDriver::Firefox::Marionette::Driver:0x..fb3c81796cc82b708 browser=:firefox>

irb(main):003:0> driver.navigate().to("http://www.google.com")
=> nil

irb(main):188:0> driver.find_element(:name, "q").send_keys "fff"
=> nil    

irb(main):112:0> driver.find_element(:name, "btnK");
=> #<Selenium::WebDriver::Element:0x5fb450f4379c50ce id="d767311c-27a2-3544-8f11-e4edc9736588">

irb(main):113:0> driver.find_element(:name, "btnK").attribute('value');
=> "Google Search"
irb(主):001:0>需要“selenium webdriver”
=>正确
irb(main):002:0>driver=Selenium::WebDriver.for:firefox
=> #
irb(主):003:0>驱动程序。导航()。到(“http://www.google.com")
=>零
irb(main):188:0>驱动程序。查找元素(:name,“q”)。发送键“fff”
=>零
irb(主):112:0>驱动程序。查找元素(:名称,“btnK”);
=> #
irb(main):113:0>driver.find_元素(:name,“btnK”).attribute('value');
=>“谷歌搜索”
但我无法点击它

irb(main):114:0> driver.find_element(:name, "btnK").click
Traceback (most recent call last):
       16: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/w3c/bridge.rb:552:in `execute'
       15: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/bridge.rb:166:in `execute'
       14: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:62:in `call'
       13: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/default.rb:104:in `request'
       12: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `create_response'
       11: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in `new'
       10: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:32:in `initialize'
        9: from /usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:69:in `assert_ok'
        8: from clickElement@chrome://marionette/content/listener.js:1209:5
        7: from navigate@chrome://marionette/content/listener.js:409:13
        6: from navigate/<@chrome://marionette/content/listener.js:410:13
        5: from clickElement/<@chrome://marionette/content/listener.js:1210:14
        4: from interaction.clickElement@chrome://marionette/content/interaction.js:130:11
        3: from webdriverClickElement@chrome://marionette/content/interaction.js:159:11
        2: from ElementNotInteractableError@chrome://marionette/content/error.js:286:5
        1: from WebDriverError@chrome://marionette/content/error.js:178:5
Selenium::WebDriver::Error::ElementNotInteractableError (Element <input name="btnK" type="submit"> could not be scrolled into view)
irb(main):115:0> 
irb(main):114:0>驱动程序。查找元素(:name,“btnK”)。单击
回溯(最近一次呼叫最后一次):
16:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/w3c/bridge.rb:552:in'execute'
15:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/bridge.rb:166:in'execute'
14:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:62:in“call”
13:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/default.rb:104:在“请求”中
12:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in“create_response”
11:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/http/common.rb:84:in“new”
10:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:32:in'initialize'
9:from/usr/local/lib/ruby/gems/2.5.0/gems/selenium-webdriver-3.141.0/lib/selenium/webdriver/remote/response.rb:69:in'assert_ok'
8:从clickElement@chrome://木偶/content/listener.js:1209:5
7:从navigate@chrome://木偶/content/listener.js:409:13

6:从navigate/但您可以使用javascript进行单击(将javascript发送到浏览器)


Jeff解释了为什么javascript方法(selenium with javascript)可以在任意一个按钮上工作,而非javascript方法(selenium with javascript)只能在一个按钮上工作,他写道“这两个按钮都可以工作,JS点击会点击任何元素,无论它在哪里。。。或者,如果它是可见的,等等。Selenium被设计成与页面交互,因此由于错误,它无法单击元素。”

但您可以使用javascript进行单击(将javascript发送到浏览器)


Jeff解释了为什么javascript方法(selenium with javascript)适用于任意一个按钮,而非javascript方法(selenium with javascript)仅适用于一个按钮,他写道“两个按钮都可以工作,JS click将单击任何元素,无论它在何处。。。或者,如果它是可见的,等等。Selenium被设计成与页面交互,就像用户一样,因此由于错误,它无法单击元素。“

这是我告诉你使用WATIR的,如果你使用了WATIR,这个问题就不会出现了。代码中的问题不是等待可见性。最近Chrome驱动程序也添加了隐式等待单击,所以如果设置隐式等待,它将等待可见性。否则,转到WATIR,它是一个好的包装器,不会通过驱动程序等待,在WATIR中,等待元素状态发生在本地语言绑定中,所以使用下面的代码

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = 10
driver.navigate().to("http://www.google.com")
driver.find_element(:name, "q").send_keys "fff"
driver.find_element(:name, "btnK").click
请记住,此selenium代码不适用于firefox,因为firefox尚未添加隐式等待单击

由于WATIR正在处理来自本地语言绑定的计时,所以无论您使用的是Chrome还是Firefox,它都能完美地工作

WATIR代码(默认为Chrome)

如果你想驾驶Firefox

b=Watir::Browser.new :firefox

这就是我告诉你使用WATIR的,如果你使用了WATIR,这个问题就不会出现了。代码中的问题不是等待可见性。最近Chrome驱动程序也添加了隐式等待单击,所以如果设置隐式等待,它将等待可见性。否则,转到WATIR,它是一个好的包装器,不会通过驱动程序等待,在WATIR中,等待元素状态发生在本地语言绑定中,所以使用下面的代码

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome
driver.manage.timeouts.implicit_wait = 10
driver.navigate().to("http://www.google.com")
driver.find_element(:name, "q").send_keys "fff"
driver.find_element(:name, "btnK").click
请记住,此selenium代码不适用于firefox,因为firefox尚未添加隐式等待单击

由于WATIR正在处理来自本地语言绑定的计时,所以无论您使用的是Chrome还是Firefox,它都能完美地工作

WATIR代码(默认为Chrome)

如果你想驾驶Firefox

b=Watir::Browser.new :firefox

在评论中讨论这个问题时,我编写了一些C代码来演示如何在C中等待clickable#

在写我发布的C代码的过程中,我想我看到了问题所在。开始在搜索框中键入时,会出现一个下拉列表,其中包含建议的搜索。这涵盖了你试图点击的“谷歌搜索”按钮。。。但另一个“谷歌搜索”按钮出现在下拉列表的底部。您应该打印
(:name,“btnK”)
元素的计数。。。我假设它将打印2(如果添加了适当的等待)。从那里,你只需要点击上面的那个

另一种选择是在搜索字符串末尾发送\r\n,避免整个问题。。。或者你可以导航到最终的搜索URL,节省更多的麻烦和时间

添加了barlop的注释

澄清一下,这与建议弹出窗口的显示无关(并且必须去掉弹出窗口)。。与等待无关(因为我与IRB合作,所以我自然会等待)。我已经点击了外部或者点击了escape来摆脱弹出窗口。问题是,杰夫的回答提醒了我这一点——即使在弹出窗口消失后,仍然有两个按钮带有btnK na
new WebDriverWait(Driver, TimeSpan.FromSeconds(5)).Until(ExpectedConditions.ElementToBeClickable(By.Name("btnK"))).Click();