Работа с локатором jquery в веб-драйвере селена, ruby - PullRequest
1 голос
/ 11 июня 2011

Я пытаюсь найти локатор jquery в селеновом 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.Это было так блестяще в Селене RC, и я не могу найти способ реализовать это в webdriver.

1 Ответ

1 голос
/ 27 июля 2011

После перехода на нужную страницу, но перед использованием 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 && (!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.

...