1

を使用して読み込んだページから、クリックしたすべてのリンクを新しいブラウザー タブで開きたいと考えていますdriver.get "http://www.example.com"。以前に尋ねた別の質問に回答を得ましたが、期待どおりに機能していません。コードは次のとおりです。

require 'rubygems'
require 'selenium-webdriver'

driver = Selenium::WebDriver.for :firefox
driver.get " http://www.testfire.net "

driver.find_elements(:tag_name, "a").each {|link| link.click }

このコードを実行した後、Selenium Web Driver は Firefox を開き、要求されたページを読み込み、見つかった最初のアンカー タグをクリックします。その後、エラーでクラッシュします。

これも試してみましたが、driver.find_element(:tag_name, "a").send_keys [:control,'t']これは新しいタブを開きますが、ページをロードせずに空白のタブを開きます。

エラーが発生せず、最初にロードされたページでクリックされたすべてのリンクが別のブラウザータブで開くように、これをループに配置するにはどうすればよいですか?

これが機能するために使用する必要がありwaitますか?

[remote server] resource://fxdriver/modules/web_element_cache.js:9500:in `unknown': Element not found in the cache - perhaps the page has changed since it was looked up (Selenium::WebDriver::Error::StaleElementReferenceError)
        from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:9069:in `unknown'
        from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:9504:in `unknown'
        from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10510:in `unknown'
        from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10529:in `unknown'
        from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10534:in `unknown'
        from [remote server] file:///C:/Users/AKASH/AppData/Local/Temp/webdriver-profile20120427-1496-sev0j4/extensions/fxdriver@googlecode.com/components/command_processor.js:10482:in `unknown'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/response.rb:52:in `assert_ok'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/response.rb:15:in `initialize'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/common.rb:59:in `new'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/common.rb:59:in `create_response'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/default.rb:64:in `request'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/http/common.rb:40:in `call'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/bridge.rb:594:in `raw_execute'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/bridge.rb:572:in `execute'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/remote/bridge.rb:354:in `clickElement'
        from D:/Ruby193/lib/ruby/gems/1.9.1/gems/selenium-webdriver-2.20.0/lib/selenium/webdriver/common/element.rb:34:in `click'
        from selclick.rb:6:in `block in <main>'
        from selclick.rb:5:in `each'
        from selclick.rb:5:in `<main>'
4

2 に答える 2

1

これは「意図したとおりに機能している」と私は信じています。

ループの最初の反復は正しく機能し、その後は失敗します。その理由は、エラーによって正確に示されます。ページがリロードされたため、オブジェクト参照は正しいリンクを指していません。

これが明確かどうかはわかりませんので、何が起こっているのかを正確に追跡しましょう。

あなたはあなたのページにアクセスします。すべてのリンクが配列に収集されます。ループの最初の反復で、最初のリンクをクリックします。同じページにあるリンクにアクセスします。以前のページはもう表示されていません。ループの2回目の反復では、前のページのリンクが検索されます。次のページにいるので、もうそこにはありません。したがって、エラー。

あなたが達成しようとしているのは正確には何ですか?サイトのすべてのページにアクセスしようとしていますか?

サイトをクロールしようとしている場合は、代わりにMechanizeまたはAnemoneをお勧めしますか?

于 2012-04-27T07:20:20.397 に答える
1

Java

List<WebElement> elements = driver.find_elements( _locator_ );
for (i=0; i<elements.size(); i++) {
    List<WebElement> elements2 =driver.find_elements(_locator_) 

    WebElement ele = elements2.get(i);

    ele.click();
}
于 2012-06-28T16:12:03.570 に答える