Как выбрать опцию, выбранный с помощью клиента Selenium webdriver (selenium 2.0) в Ruby

StackOverflow https://stackoverflow.com/questions/4672658

  •  10-10-2019
  •  | 
  •  

Вопрос

Я пытаюсь познакомиться с новым 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")

Так что в основном я вхожу в свой сайт и пытаюсь добавить запись в профиль моего пользователя. .. Я не вижу, как это сделать в новом клиенте ... единственное, что я могу подумать, это проходить все варианты, пока я не найду тот, который хочу, а затем вызову execute_script:http://selenium.googlecode.com/svn/trunk/docs/api/rb/selenium/webdriver/driver.html#execute_script-class_methodМетод для установки SelectedIndex.

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

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

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

Это было полезно?

Решение

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

my_select.click
my_select.find_elements( :tag_name => "option" ).find do |option|
  option.text == value
end.click

Другие советы

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

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

В терминах псевдокода/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;
        }
    }

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

Я не знаю, какую версию это появилось, но похоже, что есть класс Select, который упомянул Pnewhook в 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")

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

Вы можете использовать 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 + "']"));
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

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

Для последней версии WebDriver (RC3) вы должны использовать «click ()» вместо setSelected (). Также опция.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;
    }
}

Ruby Code с примером:

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

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

select_elem.find_element (: css, "option [value = 'some_value']). Нажмите

#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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top