我正在使用Selenium Webdriver gem尝试点击Facebook聊天栏,有时它可以工作,有时它不会

时间:2015-01-23 05:30:42

标签: ruby facebook selenium selenium-webdriver

我正在使用Selenium Webdriver gem尝试点击Facebook聊天栏,有时它可以工作,有时它不会。当它不起作用时,它返回Selenium Element不可见错误,但它显然是可见的。我不确定我的代码有什么问题。

require 'selenium-webdriver'
driver = Selenium::WebDriver.for :chrome # instantiates a google chrome session
driver.navigate.to 'https://www.facebook.com/' # takes you to facebook.com

emailBar = driver.find_element(:id,"email") #finds email input bar
passwordBar = driver.find_element(:id,"pass") #find password input bar
loginButton = driver.find_element(:id,"u_0_n") #finds login button

emailBar.send_keys "austinspreadsheet@gmail.com" # puts in the email
passwordBar.send_keys "YOURPASSWORD" # puts in the password
loginButton.click # clicks the login button

#THIS IS THE CODE BLOCK THAT DOES NOT WORK 
links = driver.find_elements(:class,"fbNubButton") # finds the chat bar
#driver.manage.timeouts.page_load = 10
links[0].click # opens the chat bar
links[1].click # NOTE that sometime it clicks and sometimes it doesn't but if you click both chat box classes it usually works, so the error is ok

我尝试不点击这两个聊天链接,当我这样做时,它的工作量会减少。

4 个答案:

答案 0 :(得分:0)

我正在使用Selenium和Python。如果像你的一样,问题与等待页面中的所有元素都已满载有关。

Selenium的基本行为为您提供显式和隐式等待。所以基本上你可以强制系统等待一个默认的秒数,或者等到一个元素被加载。

来自Selenium文档(http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp

明确等待

显式等待是您定义的代码,用于在进一步执行代码之前等待某个条件发生。最糟糕的情况是Thread.sleep(),它将条件设置为等待的确切时间段。提供了一些便捷方法,可帮助您编写仅在需要时等待的代码。 WebDriverWait与ExpectedCondition相结合是一种可以实现的方法。

require 'rubygems' # not required for ruby 1.9 or if you installed without gem
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get "http://somedomain/url_that_delays_loading"

wait = Selenium::WebDriver::Wait.new(:timeout => 10) # seconds
begin
  element = wait.until { driver.find_element(:id => "some-dynamic-element") }
ensure
  driver.quit
end

隐含等待

隐式等待是告诉WebDriver在尝试查找一个或多个元素(如果它们不是立即可用)时轮询DOM一段时间。默认设置为0.设置后,将为WebDriver对象实例的生命周期设置隐式等待。

require 'rubygems' # not required for ruby 1.9 or if you installed without gem
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10 # seconds

driver.get "http://somedomain/url_that_delays_loading"
element = driver.find_element(:id => "some-dynamic-element")

答案 1 :(得分:0)

在这个帖子中,aberna给你的答案有很多很好的信息,但它不会解决你的问题。如果您使用aberna建议的显式等待方法,您可能还需要确保元素可见。单独使用.findElements并不能保证可点击性/可见性。您可以尝试使用预期条件.visibilityOfElementLocated,它还会检查可见性和存在。

或者,您也可以使用.findElement检查DOM上是否存在元素,然后使用expectedconditions.visibilityOf检查它的可见性部分。

答案 2 :(得分:0)

我在运行主逻辑

之前使用sleep(5)

答案 3 :(得分:0)

我遇到了同样的问题。对我有用的解决方案是最大化我的浏览器窗口。这解决了许多失败的规范。

Capybara.current_session.driver.browser.manage.window.maximize