2016-01-20 2 views
3

Работа над методом, пытающимся понять явное ожидание.Явное ожидание Selenium Webdriver

require 'rubygems' 
require 'selenium-webdriver' 
require 'cucumber' 

$driver = Selenium::WebDriver.for :firefox 
$driver.manage.timeouts.implicit_wait = 3 

    Then /^do search$/ do 
    driver = $driver 
    one_way = driver.find_element(:id, "search.ar.type.code.oneWay").click 
    sleep 5 
    from = driver.find_element :xpath => "//div[@class = 'origin column1']//input[@type = 'text']" 
    from.click 

Таким образом, после one_way радио-кнопка нажата и форма ввода изменилась, поэтому я ставлю sleep 5, чтобы дать ему элемент времени, чтобы появиться, в противном случае была бы ошибка «элемент не видно ...». Поэтому я подумал, что было бы хорошо понять явное ожидание, потому что мне нужно подождать, пока не появится элемент.

wait = Selenium::WebDriver::Wait.new(:timeout => 40) 
    wait.until {from = driver.find_element(:xpath, "//div[@class = 'origin column1']//input[@type = 'text']") 
    from.click 
    } 

Но получить ошибки "Селен :: WebDriver :: Error :: ElementNotVisibleError: Элемент в настоящее время не видно и поэтому не может быть взаимодействовали с". Почему этот код не дожидается появления элемента и щелкните его?

+0

Смотрите первый фрагмент кода в следующем [ответ] (HTTP://stackoverflow.com/a/14701534/2998271) – har07

+0

@ har07, спасибо. Я видел, что где-то некоторые исследования, но я пытаюсь понять, как взаимодействовать с элементом, используя команду click –

ответ

4

Проблема в том, что элемент еще не находится в DOM, поэтому вам нужно установить там временную задержку.

Тем не менее, API doco for ruby говорит, что вы должны сделать это таким образом

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 

отмечают, что элемент, который вы можете затем .click() назначается из метода wait.until а не find_element() метод, как в вашем код.

Однако, что произвольные задержки не всегда работают, если сайт занят, тогда задержка может быть недостаточной. Лучшим вариантом является ожидание того, что элемент станет кликабельным или видимым.

The Java API, имеют ExpectedConditions convenience methods что сп быть использован, как это ...

WebDriverWait wait = new WebDriverWait(driver, 10); 
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid"))); 
element.click(); 

Unfortunatly Я не думаю, что Руби имеет это еще. Возможно, вам понадобится код для вашего собственного класса или пакета ExpectedCondition.

Я не DEV рубин, но здесь идея функции в Java, которая может быть использована для реализации вашей ExpectedCondition

public WebElement findElementInTime(WebDriver driver, By by, int timeoutInSeconds) 
    { 
     log.debug("==================+>>>>>> looking for element for "+ timeoutInSeconds + " seconds"); 
     WebElement ret = null; 

     for (int second = 0; second < timeoutInSeconds; second++) { 
      try { if (isElementPresent(driver,by)) { 
       log.debug("found element :-)"); 
       ret = driver.findElement(by); 
       break; 
      }} catch (Exception e) { 

       log.debug("oops... sleeping 1 sec wait for button"); 
      } 
      log.debug("sleeping 1 sec wait for button"); 
     } 
     return ret; 
    } 
+0

спасибо за ваш комментарий, это дает мне некоторую идею, поэтому я буду продолжать смотреть! –

Смежные вопросы