Comment puis-je configurer une option, comme sélectionné Sélénium WebDriver (sélénium 2.0) client en ruby
-
10-10-2019 - |
Question
Je suis en train de se familiariser avec le nouveau sélénium WebDriver rubis tel qu'il apparaît plus intuitive surtout que la version précédente du sélénium et le pilote rubis qui allait avec. De plus, j'ai eu du mal à obtenir le vieux sélénium à travailler avec Ruby 1.9.1 dans les fenêtres, donc je pensais que je cherche une solution de rechange. Jusqu'à présent, je l'ai fait 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, fondamentalement, je vous connecter à mon site et essayer d'ajouter une entrée d'éducation à mon profil utilisateur .. J'ai une référence à une zone de sélection avec des options (dans la variable country_select) et maintenant je veux choisir une option avec une valeur donnée .. Je ne vois pas comment faire cela dans le nouveau client .. la seule chose que je peux penser à faire est une boucle à travers toutes les options jusqu'à ce que je trouve celui que je veux, puis appelez execute_script: http://selenium.googlecode.com/svn/ trunk / docs / api / rb / sélénium / WebDriver / Driver.html # execute_script-class_method Procédé pour régler la selectedIndex.
Y at-il une autre façon de le faire? Dans le api java pour le sélénium 2.0 / WebDriver ici: http://seleniumhq.org/docs/09_webdriver.html il est un exemple de le faire
Select select = new Select(driver.findElement(By.xpath("//select")));
select.deselectAll();
select.selectByVisibleText("Edam");
Il ne semble pas que la version rubis a cette fonction que si je ne me manque quelque chose. Toute aide serait appréciée.
La solution
S'il vous plaît noter qu'aucun des ci-dessus fonctionnera plus. Element#select
et Element#toggle
ont été désapprouvés. Vous devez faire quelque chose comme:
my_select.click
my_select.find_elements( :tag_name => "option" ).find do |option|
option.text == value
end.click
Autres conseils
La divulgation complète ici. Je n'ai absolument pas connaissance pratique de Ruby
Cependant, je suis assez bien avec Sélénium donc je pense que je peux aider. Je pense que ce que vous cherchez est le méthode de select
. Si le rubis est quelque chose comme les autres pilotes que vous pouvez utiliser la méthode de sélection pour dire l'une des options est sélectionné.
En termes pseudocode / java, il ressemblerait à quelque chose comme ceci
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;
}
}
Le Select objet que vous avez ci-dessus est en fait dans un package de support spécial. Il existe seulement pour Java et .Net au moment (janvier 2011)
Je ne sais pas quelle version Sélénium cela est arrivé, mais il semble que il y a la classe Select qui pnewhook mentionné dans Sélénium 2.20
option = Selenium::WebDriver::Support::Select.new(@driver.find_element(:xpath => "//select"))
option.select_by(:text, "Edam")
pnewhook a mais je voudrais poster la version rubis ici que tout le monde peut le 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, ce n'est qu'un échantillon de travail.
Pour la dernière version de WebDriver (RC3), vous devez utiliser "cliquez sur ()" au lieu de setSelected (). . De plus option.getText () equals ( "nom que vous voulez") devrait être utilisé au lieu 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;
}
}
Code de Ruby 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
La façon la plus simple que j'ai trouvé:
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