33

新しいrubyselenium-webdriverは、以前のバージョンのseleniumとそれに付属するrubyドライバーよりもほとんど直感的に見えるため、慣れようとしています。また、古いセレンをウィンドウ内のルビー1.9.1で動作させるのに苦労したので、別の方法を探したいと思いました。これまでのところ、スクリプトを使用してこれを実行しました。

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

つまり、基本的には自分のサイトにログインして、ユーザープロファイルに教育エントリを追加しようとしています。(country_select変数に)オプションのある選択ボックスへの参照があり、指定された値のオプションを選択したいと思います。 ..新しいクライアントでこれを行う方法がわかりません..私が考えることができる唯一のことは、必要なオプションが見つかるまですべてのオプションをループしてから、execute_script: http://seleniumを呼び出すことです。 googlecode.com/svn/trunk/docs/api/rb/Selenium/WebDriver/Driver.html#execute_script-class_method メソッドを使用してselectedIndexを設定します。

これを行う他の方法はありますか?ここにあるselenium2.0/ webdriverのJavaAPI:http ://seleniumhq.org/docs/09_webdriver.html これを行う例があります

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

何かが足りない場合を除いて、ルビーバージョンにはこの機能があるようには見えません。どんな助けでもいただければ幸いです。

4

10 に答える 10

35

ここでの完全な開示:私はRubyの実用的な知識をまったく持っていません。

しかし、私はセレンがかなり得意なので、私は助けることができると思います。あなたが探しているのはselect 方法だと思います。rubyが他のドライバーのようなものである場合は、selectメソッドを使用して、選択されているオプションの1つを通知できます。

擬似コード/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;
        }
    }

上記のSelectオブジェクトは、実際には特別なサポートパッケージに含まれています。現時点では、Javaと.Netにのみ存在します(2011年1月)

于 2011-01-12T21:20:39.117 に答える
20

上記のいずれも機能しなくなることに注意してください。Element#selectおよびElement#toggle非推奨になりました。次のようなことをする必要があります。

my_select.click
my_select.find_elements( :tag_name => "option" ).find do |option|
  option.text == value
end.click
于 2011-07-29T05:05:15.833 に答える
14

これがどのバージョンのSeleniumで発生したかはわかりませんが、Selenium2.20でpnewhookが言及したSelectクラスがあるようです。

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")
于 2012-04-03T20:54:22.423 に答える
7

pnewhookはそれを手に入れましたが、誰もがそれを見ることができるように、ここにルビーバージョンを投稿したいと思います:

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
于 2011-01-14T01:42:09.517 に答える
6

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 + "']"));
于 2011-10-25T11:47:20.137 に答える
3
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

私の場合、これは1つの作業サンプルにすぎません。

于 2011-12-14T11:40:28.563 に答える
2

最新バージョンのWebdriver(RC3)の場合、setSelected()の代わりに「click()」を使用する必要があります。また、JAVAではoption.getText()== "Name you want"の代わりにoption.getText()。equals( "Name you want")を使用する必要があります。

<!-- 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;
    }
}
于 2011-06-27T08:19:38.607 に答える
1

例を含むRubyコード:

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
于 2011-08-19T06:10:23.623 に答える
0
#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
于 2012-06-14T07:05:15.860 に答える
0

私が見つけた最も簡単な方法は次のとおりです。

select_elem.find_element(:css, "option[value='some_value']").click
于 2012-06-25T10:55:02.907 に答える