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.
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
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)
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
option = Selenium::WebDriver::Support::Select.new(@driver.find_element(:xpath => "//select"))
option.select_by(:text, "Edam")
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
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 + "']"));
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.
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;
}
}
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
Le moyen le plus simple que j'ai trouvé était:
select_elem.find_element (: css, "option [value = 'some_value']"). cliquez sur
#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