Как выбрать опцию, выбранный с помощью клиента Selenium webdriver (selenium 2.0) в Ruby
-
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
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