Как установить параметр, выбранный с помощью клиента Selenium WebDriver (selenium 2.0) в ruby - PullRequest
30 голосов
/ 12 января 2011

Я пытаюсь ознакомиться с новым ruby ​​selenium-webdriver, так как он выглядит более интуитивно понятным, чем предыдущая версия selenium и драйвер ruby, который шел с ним.Кроме того, у меня были проблемы с тем, чтобы заставить старый селен работать с ruby ​​1.9.1 в Windows, поэтому я подумал, что я буду искать альтернативу.До сих пор я делал это с помощью своего скрипта:

require "selenium-webdriver"

driver = Selenium::WebDriver.for :firefox
driver.get "https://example.com"

element = driver.find_element(:name, 'username')
element.send_keys "mwolfe"
element = driver.find_element(:name, 'password')
element.send_keys "mypass"
driver.find_element(:id, "sign-in-button").click
driver.find_element(:id,"menu-link-my_profile_professional_info").click
driver.find_element(:id,"add_education_btn").click
country_select = driver.find_element(:name, "address_country")

Итак, я в основном захожу на свой сайт и пытаюсь добавить запись об образовании в свой профиль пользователя. У меня есть ссылка на поле выборас параметрами (в переменной country_select), и теперь я хочу выбрать параметр с заданным значением. Я не вижу, как это сделать в новом клиенте. Единственное, что я могу придумать, это перебрать вседо тех пор, пока я не найду нужный, а затем вызову метод execute_script: http://selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method, чтобы установить selectedIndex.

Есть ли другой способ сделать это?В Java-API для Selen 2.0 / WebDriver здесь: http://seleniumhq.org/docs/09_webdriver.html есть пример этого

Select select = new Select(driver.findElement(By.xpath("//select")));
select.deselectAll();
select.selectByVisibleText("Edam");

Не похоже, что версия ruby ​​имеет эту функцию, хотя, если я нечего-то не хватаетЛюбая помощь будет оценена.

Ответы [ 10 ]

34 голосов
/ 13 января 2011

Полное раскрытие здесь: у меня нет абсолютно никаких рабочих знаний о Ruby.

Тем не менее, я неплохо справляюсь с Selenium, поэтому думаю, что смогу помочь. Я думаю, что вы ищете метод select. Если ruby ​​не похож на другие драйверы, вы можете использовать метод select, чтобы указать один из выбранных параметров.

В терминах псевдокод / ​​Java это будет выглядеть примерно так

    WebElement select = driver.findElement(By.name("select"));
    List<WebElement> options = select.findElements(By.tagName("option"));
    for(WebElement option : options){
        if(option.getText().equals("Name you want")) {
            option.click();
            break;
        }
    }

Объект Select, который у вас есть, на самом деле находится в специальном пакете поддержки. На данный момент существует только для Java и .Net (январь 2011 г.)

17 голосов
/ 29 июля 2011

Обратите внимание, что ничего из вышеперечисленного больше не будет работать. Element#select и Element#toggle устарели. Вам нужно сделать что-то вроде:

my_select.click
my_select.find_elements( :tag_name => "option" ).find do |option|
  option.text == value
end.click
13 голосов
/ 04 апреля 2012

Я не знаю, с какой версией Selenium это произошло, но похоже, что есть класс Select, упомянутый в Selenium 2.20

.

http://selenium.googlecode.com/svn-history/r15117/trunk/docs/api/rb/Selenium/WebDriver/Support/Select.html

option = Selenium::WebDriver::Support::Select.new(@driver.find_element(:xpath => "//select"))
option.select_by(:text, "Edam")
7 голосов
/ 14 января 2011

pnewhook получил его, но я хотел бы опубликовать здесь версию ruby, чтобы все могли ее увидеть:

require "selenium-webdriver"
driver = Selenium::WebDriver.for :firefox
driver.manage.timeouts.implicit_wait = 10
driver.get "https://example.com"  
country_select = driver.find_element(:id=> "address_country")
options = country_select.find_elements(:tag_name=>"option")
options.each do |el|
    if (el.attributes("value") == "USA") 
        el.click()
        break
    end
end
6 голосов
/ 25 октября 2011

Вы можете использовать XPath , чтобы избежать зацикливания:

String nameYouWant = "Name you want";
WebElement select = driver.findElement(By.id(id));
WebElement option = 
  select.findElement(By.xpath("//option[contains(text(),'" + nameYouWant + "')]"));
option.click();

или

WebElement option = 
  select.findElement(By.xpath("//option[text()='" + nameYouWant + "']"));
3 голосов
/ 14 декабря 2011
require "selenium-webdriver"
webdriver = Selenium::WebDriver.for :firefox

driver.navigate.to url

dropdown = webdriver.find_element(:id,dropdownid)
return nil if dropdown.nil?
selected = dropdown.find_elements(:tag_name,"option").detect { |option| option.attribute('text').eql? value}
 if selected.nil? then
  puts "Can't find value in dropdown list"
 else
  selected.click
 end

В моем случае это только один рабочий образец.

2 голосов
/ 27 июня 2011

Для последней версии Webdriver (RC3) вы должны использовать «click ()» вместо setSelected ().Кроме того, option.getText (). Equals («Имя, которое вы хотите») следует использовать вместо option.getText () == «Имя, которое вы хотите» в JAVA:

<!-- language: lang-java --> 
WebElement select = driver.findElement(By.name("select"));
List<WebElement> options = select.findElements(By.tagName("option"));
for(WebElement option : options){
    if(option.getText().equals("Name you want"){
        option.click();
        break;
    }
}
1 голос
/ 19 августа 2011

код Ruby с примером:

require "selenium-webdriver"

driver = Selenium::WebDriver.for :ie

driver.navigate.to "http://google.com"
a=driver.find_element(:link,'Advanced search')

a.click


a=driver.find_element(:name,'num')

options=a.find_elements(:tag_name=>"option")
options.each do |g|
  if g.text == "20 results"
  g.click
  break
  end
end
0 голосов
/ 25 июня 2012

Самый простой способ, который я нашел:

select_elem.find_element (: css, "option [value = 'some_value']"). Click

0 голосов
/ 14 июня 2012
#SELECT FROM DROPDOWN IN RUBY USING SELENIUM WEBDRIVER
#AUTHOR:AYAN  DATE:14 June 2012

require "rubygems"
require "selenium-webdriver"



  begin
    @driver = Selenium::WebDriver.for :firefox
    @base_url = "http://www.yoururl.com"
    @driver.manage.timeouts.implicit_wait = 30

    @driver.get "http://www.yoursite.com"


    #select Urugway as Country
     Selenium::WebDriver::Support::Select.new(@driver.find_element(:id, "country")).select_by(:text, "Uruguay")

        rescue Exception => e
         puts e
         @driver.quit


    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...