Wie kann ich eine Option festlegen, wie Selen WebDriver (Selen 2.0) Client in rubin ausgewählt mit
-
10-10-2019 - |
Frage
Ich versuche, mit den neuen Rubin Selen-WebDriver vertraut zu machen, wie es intuitiver erscheint meist als die vorherige Version von Selen und dem Rubin-Treiber, der mit ihm ging. Außerdem hatte ich Mühe, die alten Selen zur Arbeit mit Ruby 1.9.1 in den Fenstern so dass ich dachte, dass ich nach einer Alternative aussehen würde. Bisher habe ich dies getan mit meinem Skript:
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")
Also im Grunde ist ich die Anmeldung in meiner Seite und versuche, eine Ausbildung Eintritt in meinem Benutzerprofil hinzuzufügen .. Ich habe einen Verweis auf ein Auswahlfeld mit Optionen (in dem country_select Variable) und jetzt will ich eine Option wählen mit ein gegebener Wert .. ich sehe nicht, wie dies in den neuen Client tun .. das einzige, was ich zu tun, durch alle Optionen denken kann, ist Looping, bis ich die, die ich möchte finden, und dann execute_script nennen: http://selenium.googlecode.com/svn/ trunk / docs / api / rb / Selen / WebDriver / Driver.html # execute_script-class_method Methode, um die selectedIndex einzustellen.
Gibt es eine andere Möglichkeit, dies zu tun? In dem Java-API für Selen 2.0 / WebDriver hier: http://seleniumhq.org/docs/09_webdriver.html gibt es ein Beispiel dieses
zu tunSelect select = new Select(driver.findElement(By.xpath("//select")));
select.deselectAll();
select.selectByVisibleText("Edam");
Es ist nicht ersichtlich, dass die Ruby-Version dieses Feature allerdings hat, es sei denn ich etwas fehle. Jede mögliche Hilfe würde geschätzt.
Lösung
Bitte beachten Sie, dass keine der oben genannten Wille Arbeit mehr. Element#select
und Element#toggle
sind veraltet. Sie tun müssen, um so etwas wie:
my_select.click
my_select.find_elements( :tag_name => "option" ).find do |option|
option.text == value
end.click
Andere Tipps
Vollständige Offenlegung hier:. Ich habe absolut keine Kenntnisse von Ruby
Aber ich bin ziemlich gut mit Selen so dass ich denke, ich kann helfen. Ich denke, was Sie suchen ist die select
Methode. Wenn Rubin so etwas wie die anderen Fahrer ist, können Sie die Methode wählen Sie eine der Optionen sagen, es ausgewählt ist.
In Pseudo-Code / java Bedingungen wäre es etwa so aussehen
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;
}
}
Das Objekt wählen Sie oben haben, ist tatsächlich in einem speziellen Support-Paket. Es existiert nur für Java und .NET zur Zeit (Januar 2011)
Ich weiß nicht, was Version Selen dazu kam, aber es sieht aus wie es die Select-Klasse ist, dass pnewhook in Selenium erwähnt 2.20
option = Selenium::WebDriver::Support::Select.new(@driver.find_element(:xpath => "//select"))
option.select_by(:text, "Edam")
got pnewhook es, aber ich mag die Ruby-Version hier veröffentlichen, damit jeder sehen kann:
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
Sie können mit XPath vermeiden Looping:
String nameYouWant = "Name you want";
WebElement select = driver.findElement(By.id(id));
WebElement option =
select.findElement(By.xpath("//option[contains(text(),'" + nameYouWant + "')]"));
option.click();
oder
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
In meinem Fall ist dies nur eine Arbeitsprobe.
Für die neueste Version von WebDriver (RC3) sollten Sie verwenden "klicken ()" statt setSelected (). . Auch option.getText () gleich ( "Name Sie wollen") anstelle von option.getText () == "Name, den Sie wollen" in JAVA verwendet werden soll:
<!-- 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 mit Beispiel:
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
Der einfachste Weg, ich fand, war:
select_elem.find_element. (: Css "Option [value = 'some_value']") klicken
#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