web-dev-qa-db-fra.com

Comment définir une option à l'aide du client Selenium WebDriver (Selenium 2.0) en ruby

J'essaie de me familiariser avec le nouveau pilote Web Ruby Selenium car il semble plus intuitif que la version précédente de Selenium et le pilote Ruby qui l'accompagnait. De plus, j'avais du mal à faire fonctionner l'ancien Selenium avec Ruby 1.9.1 dans Windows, alors je pensais que je chercherais une alternative. Jusqu'ici j'ai fait ceci avec mon script:

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")

Donc, en gros, je me connecte à mon site et j'essaie d'ajouter une entrée d'éducation à mon profil d'utilisateur. J'ai une référence à une zone de sélection avec des options (dans la variable country_select) et je souhaite maintenant sélectionner une option avec une valeur donnée. .. Je ne vois pas comment faire cela dans le nouveau client .. La seule chose à laquelle je peux penser est de parcourir toutes les options jusqu'à ce que je trouve celle que je veux, puis d'appeler execute_script: http : //Selenium.googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method Pour définir le selectedIndex.

Existe-t-il un autre moyen de le faire? Dans l’API Java pour Selenium 2.0/webdriver, cliquez ici: http://seleniumhq.org/docs/09_webdriver.html Il existe un exemple de ce type de comportement 

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

Il ne semble pas que la version Ruby dispose de cette fonctionnalité, à moins que quelque chose ne me manque… .. Toute aide serait la bienvenue.

30
Matt Wolfe

Veuillez noter qu'aucun des éléments ci-dessus ne fonctionnera plus. Element#select et Element#toggle sont obsolètes. Vous devez faire quelque chose comme:

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

Divulgation complète ici: je n'ai absolument aucune connaissance pratique de Ruby.

Cependant, je suis assez bon avec Selenium, je pense donc pouvoir vous aider. Je pense que vous recherchez la méthode select . Si Ruby est un peu comme les autres pilotes, vous pouvez utiliser la méthode select pour indiquer l’une des options sélectionnées.

En termes de pseudocode/Java, cela ressemblerait à quelque chose comme ça 

    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;
        }
    }

L'objet Select que vous avez ci-dessus est en réalité dans un package de support spécial. Il n'existe que pour Java et .Net pour le moment (janvier 2011)

34
pnewhook

Je ne sais pas quelle version Selenium a été créée, mais on dirait que c’est la classe Select que pnewhook est mentionnée dans 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")
13
grumpasaurus

pnewhook l'a eue mais j'aimerais poster la version Ruby ici pour que tout le monde puisse la voir:

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
7
Matt Wolfe

Vous pouvez utiliser XPath pour éviter les boucles:

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

ou

WebElement option = 
  select.findElement(By.xpath("//option[text()='" + nameYouWant + "']"));
6
David Carboni
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

Dans mon cas, il ne s'agit que d'un échantillon de travail.

3
user1097652

Pour la dernière version de Webdriver (RC3), vous devez utiliser "click ()" au lieu de setSelected (). De plus, option.getText (). Equals ("Nom que vous voulez") doit être utilisé à la place de option.getText () == "Nom que vous voulez" en 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;
    }
}
2
DHL

Ruby Code avec Exemple:

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
1
Jazzezravi

Le moyen le plus simple que j'ai trouvé était:

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

0
user337620
#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
0
Ayan