Я использую гем Selenium Webdriver, чтобы попытаться нажать на панель чата facebook, иногда это работает, а иногда нет.

Я использую гем Selenium Webdriver, чтобы попытаться нажать на панель чата facebook, иногда это работает, а иногда нет. Когда он не работает, он возвращает ошибку Selenium Element not visible, но он явно виден. Я не уверен, что не так с моим кодом.

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 "[email protected]" # 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

Я пытался не нажимать на обе ссылки чата, и когда я это делаю, это работает хуже.


person user3813472    schedule 23.01.2015    source источник
comment
Я тоже сталкивался с такими проблемами. Я бы посоветовал вам использовать sleep (5), прежде чем нажимать . 5 секунд будет достаточно, чтобы DOM был готов.   -  person pkrawat1    schedule 23.01.2015
comment
Привет, ребята, я только что использовал функцию расширения страницы, чтобы сделать страницу достаточно большой, чтобы друзья из Facebook автоматически отображались сбоку страницы. driver.manage.window.resize_to(1300,940)   -  person user3813472    schedule 25.01.2015


Ответы (4)


Я использую 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")
person aberna    schedule 23.01.2015
comment
Спасибо за это, я использую его в более новых частях кода, например, чтобы дождаться загрузки друзей из Facebook. - person user3813472; 25.01.2015

Ответ, который аберна дает вам в этой теме, содержит много полезной информации, но он не решит вашу проблему. Если вы используете метод ожидания Explicit, который предлагает aberna, вам также, вероятно, потребуется убедиться, что элемент виден. Использование .findElements само по себе не гарантирует кликабельность/видимость. Вы можете попробовать использовать ожидаемые условия .visibilityOfElementLocated, которые также будут проверять видимость и присутствие.

Или, в качестве альтернативы, вы можете проверить наличие элемента в DOM с помощью .findElement, а затем использовать ожидаемые условия.visibilityOf для проверки его части видимости.

person djangofan    schedule 23.01.2015

Я использую sleep(5) перед запуском основной логики

person user1179871    schedule 23.01.2015

Я столкнулся с той же проблемой. Решение, которое сработало для меня, состояло в том, чтобы развернуть окно браузера. Это решило многие из неудачных спецификаций.

Capybara.current_session.driver.browser.manage.window.maximize
person Prajakta    schedule 05.01.2016