私はセレンの問題を抱えています。私が持っているセットアップと私がやろうとしていることを説明するために最善を尽くします.
短いバージョン:
ruby webdriver gem を使用してローカルで自動テストを実行すると、問題なく動作します。selenium-server スタンドアロン jar を介してまったく同じスクリプトを実行しても (リモートでもローカルでも)、コードに奇妙な変更がなければ機能しません。
- Webdriver クライアント ライブラリと同じように動作する Selenium サーバー スタンドアロン jar のバージョンを取得する方法はありますか?
- または、セレンサーバーのリモートルビージェムバージョンがあるので、セレンのもののジェム化バージョンはリモートで動作できますか?
基本的な要約: 「私はフーターズにいるような気分で、食事が必要です。ここには非常に基本的なものが欠けています。」
私がやろうとしていること:
Web アプリケーションのテストを自動化しようとしています。会社の Web サイトを読み込んで、実際のユーザーと同じようにページ要素を操作できるようにするという考えです (リンクをクリックする、テキスト ボックスにテキストを入力する、ラジオ ボタンとチェックボックスを選択するなど)。ruby 1.9.3 と selenium-webdriver gem for ruby on a mac (10.8.2) を使用してこれらのテストを開発しました。「WebAutomation.rb」と呼ばれる ruby ラッパー ライブラリを自分で作成し、要素をクリックするための独自のメソッドを作成しました。私が作成したラッパー メソッドの 1 つの例は次のとおりです。
def WebAutomation.click_element_by_attribute(attribute_name, attribute_value, tag, contains=true)
element = WebAutomation.find_element_by_attribute(attribute_name, attribute_value, tag, contains)
@log.debug("Element returned: #{element}")
raise "Could not click element with #{attribute_name} attribute of #{attribute_value}" unless element.click
end
そして、WebAutomation.find_element_by_attribute は、指定したすべての要素を調べる別のメソッドを呼び出します。抽象化のもう 1 つのレイヤーとして、Ruby コードを直接実行するのではなく、cucumber スクリプトを介して実行しています。それは私の問題ではありません。このコードはすべてローカルで動作します。つまり、自動的に駆動されるブラウザーが実行中のコードに対してローカルであるということです。
ただし、私は Mac を使用しているため、ローカルでコードを実行する必要はありません。たとえば、IE で実行するようなクロスブラウザー テストを実行したいとします。したがって、Jenkinsボックスがこれらのリモートマシンにブラウザテストを実行するように指示できるJenkinsのようなシステムを介してこれを実行することを目標に、リモートMacとリモートWindowsラップトップの両方を持っています。私はまだジェンキンスのことを心配しているわけではありません。テストのリモートバージョンを合格させようとしているだけです。
私の悩み:
cucumber/ruby スクリプトをローカルで実行するとうまくいきます。彼らは素晴らしいです、そして私は私が男だと思った. 次に、同じブラウザー (chrome) を使用してリモートの Mac に実行したところ、すべてがポットに移動しました。
これが私がやっていることです:
リモートの Mac ラップトップで、selenium-server スタンドアロン jar をダウンロードし、次のように開始しました。
java -jar selenium-server-standalone-2.31.0.jar
それは私には幸せに見えます:
Mar 14, 2013 8:00:06 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a standalone server
08:00:11.606 INFO - Java: Oracle Corporation 23.6-b04
08:00:11.608 INFO - OS: Mac OS X 10.8.2 x86_64
08:00:11.616 INFO - v2.31.0, with Core v2.31.0. Built from revision 1bd294d
08:00:11.728 INFO - RemoteWebDriver instances should connect to: http://127.0.0.1:4444/wd/hub
08:00:11.729 INFO - Version Jetty/5.1.x
08:00:11.730 INFO - Started HttpContext[/selenium-server/driver,/selenium-server/driver]
08:00:11.730 INFO - Started HttpContext[/selenium-server,/selenium-server]
08:00:11.731 INFO - Started HttpContext[/,/]
08:00:11.744 INFO - Started org.openqa.jetty.jetty.servlet.ServletHandler@4f8429d6
08:00:11.744 INFO - Started HttpContext[/wd,/wd]
08:00:11.747 INFO - Started SocketListener on 0.0.0.0:4444
08:00:11.747 INFO - Started org.openqa.jetty.jetty.Server@4dfbca86
次に、キュウリ スクリプトを実行し、コマンド ライン引数を渡して、リモートの Mac ラップトップの IP にアクセスし、どのブラウザを実行するか、どの環境でブラウザをアプリケーションに使用するかを指示します (これは別の方法です)。重要)。
次のようになります。
cucumber REMOTE_URL=http://10.110.10.233:4444/wd/hub BROWSER=chrome JJ_ENV=staging features/jabberjaw/contact_us.feature:3
REMOTE_URL パラメーターが渡されると、ローカル ブラウザーではなくリモート ブラウザーが呼び出されるコードがあります。実行されるコードは次のとおりです。
#This is the code that runs for a local browser
def WebAutomation.set_browser(browser)
@log.debug("Starting browser: #{browser}")
@driver = Selenium::WebDriver.for(browser)
end
#If the remote url is passed in, then I make a remote browser
def WebAutomation.set_remote_browser(url, browser)
@log.debug("Starting remote browser: #{browser} at #{url}")
@driver = Selenium::WebDriver.for(:remote, :url => url, :desired_capabilities => browser)
end
リモート マシンでブラウザ ウィンドウがポップアップし、正しい URL に移動してログインします。ただし、リモートで実行している場合、selenium-server では、画面に表示されていない要素をクリックする際に問題があるようです。私はそれを(一種の)
@driver.action.move_to(element, 100, 100).perform
100、100 のオフセットを追加する必要がありました。移動しても左上隅にしか到達しないように見え、要素がまだ画面に表示されていなかったからです。もう 1 つは、element.click (上記のコード) でない限り例外が発生することをご存知ですか? ええ、クリックが実際に発生したかどうかに関係なく、何らかの理由でリモート バージョン (selenium-server) が element.click で成功するかどうかにかかわらず nil を返すため、トリガーされます。同じコードをローカルで (webdriver gem を使用して) 実行すると、成功すると {} が返され、そうでない場合は nil が返されます。したがって、このコードを Chrome でリモートで動作させるには、次のことを行う必要がありました。
def WebAutomation.click_element_by_attribute(attribute_name, attribute_value, tag, contains=true)
element = WebAutomation.find_element_by_attribute(attribute_name, attribute_value, tag, contains)
@driver.action.move_to(element, 100, 100).perform
@log.debug("Element returned: #{element}")
element.click
end
本質的に、見つかった要素に明示的に移動し、クリックを信頼するだけで機能します。はい、きゅうりでは、スクリプトの次のステップは、クリックが実行されるはずのアクションが成功したかどうかを確認する Then ステップである必要があるという点で、薄い保護層がありますが、その例外を取り除かなければならないのは間違っていると感じています潜在的に自分自身を誤検知にさらす可能性があります。
そして、この変更されたコードでさえ、Firefox のリモート バージョンでは完全に失敗します (Firefox 18 に移行する必要がありました. Firefox では、ブラウザー ウィンドウが表示され、URL に移動し、ログインします (この時点まではクロムのようです)。
また、「リモート性」を取り除き、セレンサーバーjarをローカルで実行して、ローカルブラウザーでテストを実行しようとしましたが、セレンサーバーjarを介して実行しました。そうみたい!
cucumber REMOTE_URL=http://localhost:4444/wd/hub BROWSER=chrome JJ_ENV=staging features/jabberjaw/contact_us.feature:3
そして、同じ結果が得られたので、私の問題は、selenium-server jar がスクリプトを Selenium webdriver gem とはまったく異なる方法で解釈していることだと確信しています。私はこれに遭遇した最初の人ではありませんが、目が出血するまでグーグルで検索しましたが、これに対する解決策が見つかりません.
ローカルで実行されるクライアント コードがリモートで同じように解釈される方法が必要ですよね? これは新しい問題ではありません。なぜなら、ローカルで実行しているか、リモートで実行しているか、Chrome であるか、Firefox であるかについて、奇妙なカスタム コードを作成する必要がある場合、この「自動化全体は堅牢で素晴らしいものです。 -ブラウザのテストと環境全体でのスケーリング」は、マヨネーズとマスタードを詰めたチーズケーキです。あのクリームフィリング?欲しくない。