我正在使用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
我尝试不点击这两个聊天链接,当我这样做时,它的工作量会减少。
答案 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