Работа с локатором jquery в selenium webdriver, ruby

#ruby #jquery-selectors #webdriver #selenium-webdriver

#ruby #jquery-селекторы #webdriver #selenium-webdriver

Вопрос:

Я пробую локатор jquery в selenium webdriver с ruby. Вот мой код:

 require "selenium-webdriver"

driver = Selenium::WebDriver.for(:remote, :desired_capabilities => :firefox)
driver.navigate.to("http://google.com")

# input.lst is the search input text in google.com
selector = "input.lst"

# get element from the locator
element = driver.execute_script("return $(#{selector}).get(0);")

# type "google" into the input text
element.send_keys "google"
  

Я попробовал element = driver.find_element () и это работает нормально, поэтому я думаю, возможно, есть более общий способ сделать весь локатор jquery. Вот почему я пробую execute_script. Однако, похоже, что функция execute_script не работает. Я получил много ошибок от sun.reflect, java.lang или org.openqa…

P / S: Если кто-нибудь знает, как add_location_strategy в webdriver, пожалуйста, расскажите мне об этом: D. Это было так блестяще в selenium rc, и я не могу найти способ реализовать это в webdriver.

Комментарии:

1. Было бы проще помочь, если бы вы показали нам ошибки, которые вы получаете. Код выглядит нормально, за исключением того, что Google не использует jQuery на своей главной странице.

2. Вот что я получил: [удаленный сервер] sun.reflect.NativeConstructorAccessorImpl():-2: в `newInstance0′: $ не определен (ПРЕДУПРЕЖДЕНИЕ: сервер не предоставил никакой информации о трассировке стека) (Selenium:: WebDriver::Error::UnhandledError) Информация о драйвере: driver.version: EventFiringWebDriver (org.openqa.selenium. Исключение WebDriver) …. Я просто использую jquery locator для выбора элемента.

Ответ №1:

После перехода на нужную страницу, но перед использованием jQuery:

 # load the JavaScript file into memory as a string
jQuerify = ...

# add jQuery to the current page
driver.execute_async_script(jQuerify)
  

Вот упомянутый файл JavaScript:

 /*** dynamically load jQuery ***/
(function(callback) {
    var JQUERY_URL = 'http://code.jquery.com/jquery-latest.min.js';
    if (typeof jQuery == 'undefined') {
        var script=document.createElement('script');
        script.src = JQUERY_URL;
        var head = document.getElementsByTagName('head')[0];
        var done = false;
        script.onload = script.onreadystatechange = (function() {
            if (!done amp;amp; (!this.readyState 
                    || this.readyState == 'loaded' 
                    || this.readyState == 'complete')) {
                done = true;
                script.onload = script.onreadystatechange = null;
                callback(); // tell WebDriver we are done
                head.removeChild(script);
            }
        });
        head.appendChild(script);
    }
    else {
        callback();
    }
})(arguments[arguments.length - 1]);
  

Этот фрагмент будет вставлен WebDriver в тело анонимной функции, помещая jQuery в глобальную область видимости. Содержимое файла должно быть кэшировано для повторных вызовов.

(Сильно заимствовано из jQuerify)

О, и, как правило, вы должны придерживаться Ruby API при выборе элементов. Прямое использование JavaScript считается обходным путем и противоречит духу WebDriver.