Selenium 2 に関するよくある質問
このドキュメントは以前 wiki にありました
Q: WebDriver とは何ですか?
A: WebDriver は、ウェブサイトの自動テストを作成するためのツールです。実際のユーザーの動作を模倣することを目指しており、アプリケーションの HTML と対話します。
Q: それは Selenium のようなものですか? Or Sahi?
A: 目的は同じです (ウェブアプリをテストできるようにすること) が、実装は異なります。ブラウザ内で Javascript アプリケーションとして実行するのではなく (これにより、「同一生成元」の問題など、制限が生じます)、WebDriver はブラウザ自体を制御します。これは、ネイティブプラットフォームが提供するあらゆる機能を利用できることを意味します。
Q: Selenium 2.0 とは何ですか?
A: WebDriver は Selenium の一部です。WebDriver が主に貢献しているのは、その API とネイティブドライバです。
Q: 元の Selenium API から新しい WebDriver API に移行するにはどうすればよいですか?
A: プロセスは Selenium ドキュメントの http://seleniumhq.org/docs/appendix_migrating_from_rc_to_webdriver.html で説明されています
Q: WebDriver はどのブラウザをサポートしていますか?
A: 既存のドライバは、ChromeDriver、InternetExplorerDriver、FirefoxDriver、OperaDriver、HtmlUnitDriver です。それぞれの相対的な強みと弱みを含め、詳細については、関連ページへのリンクをたどってください。AndroidDriver、OperaMobileDriver、IPhoneDriver を介したモバイルテストのサポートもあります。
Q: 「開発者向け」とはどういう意味ですか?
A: ソフトウェアアプリケーションの開発チーム内では、他のすべての人が使用できるツールを構築するのに最適なのは開発者であると私たちは考えています。WebDriver を直接使用するのは簡単であるべきですが、より洗練されたツールの構成要素として使用するのも簡単であるべきです。このため、WebDriver は、お気に入りの IDE で「オートコンプリート」ボタンを押すことで簡単に探索できる小さな API を備えており、どのブラウザ実装を使用しても一貫して動作することを目指しています。
Q: Javascript を直接実行するにはどうすればよいですか?
A: Javascript を実行する必要がある場合のほとんどは、使用されているツールに不具合があると私たちは考えています。ツールが正しいイベントを発行していない、ページとの対話が正しくない、または XmlHttpRequest が戻ったときに反応に失敗したなどです。WebDriver が一貫して正しく動作するように修正する方が、テスターがどの Javascript メソッドを呼び出すかを解明するのに頼るよりも良いと考えています。
また、これが制限になる場合があることも認識しています。その結果、サポートしているブラウザでは、WebDriver インスタンスを JavascriptExecutor (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/JavascriptExecutor.html
) にキャストすることで Javascript を実行できます。Java では、これは次のようになります。
WebDriver driver; // Assigned elsewhere
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("return document.title");
他の言語バインディングも同様のアプローチに従います。詳細については、UsingJavascript ページをご覧ください。
Q: Javascript の実行が常に null を返すのはなぜですか?
A: 値を返すには、javascript スニペットから返す必要があります。したがって
js.executeScript("document.title");
は null を返しますが、
js.executeScript("return document.title");
はドキュメントのタイトルを返します。
Q: 私の XPath はあるブラウザでは要素を見つけますが、他のブラウザでは見つけません。なぜですか?
A: 簡単な答えは、サポートされている各ブラウザが XPath の処理方法がわずかに異なり、おそらくこれらの違いの 1 つに遭遇しているということです。長い答えは、XpathInWebDriver ページにあります。
Q: InternetExplorerDriver は Vista でうまく動作しません。期待どおりに動作させるにはどうすればよいですか?
A: InternetExplorerDriver では、すべてのセキュリティドメインが同じ値 (信頼済みまたは信頼されていない) に設定されている必要があります。セキュリティドメインを変更できない場合は、次のようにチェックをオーバーライドできます。
DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
WebDriver driver = new InternetExplorerDriver(capabilities);
定数の名前からわかるように、これはテストに不安定さをもたらす可能性があります。すべてのサイトが同じ保護ドメインにある場合は、問題ないはずです。
Q: Java 以外の言語のサポートはどうですか?
A: Python、Ruby、C#、Java はすべて開発チームによって直接サポートされています。PHP と Perl 用の webdriver 実装もあります。純粋な JS API のサポートも計画されています。
Q: ポップアップウィンドウを処理するにはどうすればよいですか?
A: WebDriver は、複数のウィンドウに対応する機能を提供します。これは、「WebDriver.switchTo().window()」メソッドを使用して、既知の名前のウィンドウに切り替えることで行われます。名前が不明な場合は、「WebDriver.getWindowHandles()」を使用して、既知のウィンドウのリストを取得できます。ハンドルを「switchTo().window()」に渡すことができます。
Q: WebDriver は Javascript のアラートとプロンプトをサポートしていますか?
A: はい、Alerts API (http://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/Alert.html
) を使用します。
// Get a handle to the open alert, prompt or confirmation
Alert alert = driver.switchTo().alert();
// Get the text of the alert or prompt
alert.getText();
// And acknowledge the alert (equivalent to clicking "OK")
alert.accept();
Q: WebDriver はファイルのアップロードをサポートしていますか?
A: はい。
ネイティブ OS ファイルブラウザダイアログを直接操作することはできませんが、ファイルアップロード要素で WebElement#sendKeys("/path/to/file") を呼び出すと、適切な処理が行われるようにいくつかのマジックを行います。ファイルアップロード要素を WebElement#click() しないようにしてください。ブラウザがハングアップする可能性があります。
便利なヒント: 非表示の要素を非表示にせずに操作することはできません。要素が非表示になっている場合は、次のようなコードで非表示にできる可能性があります。
((JavascriptExecutor)driver).executeScript("arguments[0].style.visibility = 'visible'; arguments[0].style.height = '1px'; arguments[0].style.width = '1px'; arguments[0].style.opacity = 1", fileUploadElement);
Q: 「sendKeys」を呼び出した後、「onchange」イベントが発生しません
A: WebDriver は、「sendKeys」を呼び出した要素にフォーカスを残します。「onchange」イベントは、フォーカスがその要素から離れたときにのみ発生します。そのため、別の要素を「クリック」するなどして、フォーカスを移動する必要があります。
Q: WebDriver サブクラスの複数のインスタンスを実行できますか?
A: HtmlUnitDriver、ChromeDriver、FirefoxDriver の各インスタンスは、他のすべてのインスタンスから完全に独立しています (firefox と chrome の場合、各インスタンスは独自のアノニマスプロファイルを使用します)。Windows の動作方法により、一度に 1 つの InternetExplorerDriver インスタンスのみが存在する必要があります。一度に複数の InternetExplorerDriver インスタンスを実行する必要がある場合は、Remote!WebDriver と仮想マシンの使用を検討してください。
Q: プロキシを使用する必要があります。どのように設定すればよいですか?
A: プロキシ設定は、次のように org.openqa.selenium.Proxy
クラスを介して行われます。
Proxy proxy = new Proxy();
proxy.setProxyAutoconfigUrl("http://youdomain/config");
// We use firefox as an example here.
DesiredCapabilities capabilities = DesiredCapabilities.firefox();
capabilities.setCapability(CapabilityType.PROXY, proxy);
// You could use any webdriver implementation here
WebDriver driver = new FirefoxDriver(capabilities);
Q: HtmlUnitDriver で認証を処理するにはどうすればよいですか?
A: HtmlUnitDriver のインスタンスを作成するときに、たとえば、"modifyWebClient" メソッドをオーバーライドします。
WebDriver driver = new HtmlUnitDriver() {
protected WebClient modifyWebClient(WebClient client) {
// This class ships with HtmlUnit itself
DefaultCredentialsProvider creds = new DefaultCredentialsProvider();
// Set some example credentials
creds.addCredentials("username", "password");
// And now add the provider to the webClient instance
client.setCredentialsProvider(creds);
return client;
}
};
Q: WebDriver はスレッドセーフですか?
A: WebDriver はスレッドセーフではありません。そうは言っても、基盤となるドライバインスタンスへのアクセスをシリアル化できる場合は、複数のスレッドで参照を共有できます。これは推奨されません。一方、スレッドごとに 1 つの WebDriver インスタンスをインスタンス化できます。
Q: contentEditable な iframe に入力するにはどうすればよいですか?
A: iframe が「foo」という名前であると仮定します
driver.switchTo().frame("foo");
WebElement editable = driver.switchTo().activeElement();
editable.sendKeys("Your text here");
これが機能しない場合があります。これは、iframe にコンテンツがないためです。Firefox では、「sendKeys」の前に次を実行できます。
((JavascriptExecutor) driver).executeScript("document.body.innerHTML = '<br>'");
これは、iframe にデフォルトでコンテンツがないため必要です。キーボード入力を送信するものが何もありません。このメソッド呼び出しは空のタグを挿入し、すべてを適切に設定します。
完了したらフレームから必ず切り替えてください (それ以降のすべてのインタラクションはこの特定のフレームとのものになります)。
driver.switchTo().defaultContent();
Q: WebDriver が java.net.SocketException のために Linux で Firefox の起動に失敗します
A: Linux で WebDriver を実行しているときに、Firefox の起動に失敗し、エラーが次のようになっている場合
Caused by: java.net.SocketException: Invalid argument
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:365)
at java.net.Socket.bind(Socket.java:571)
at org.openqa.selenium.firefox.internal.SocketLock.isLockFree(SocketLock.java:99)
at org.openqa.selenium.firefox.internal.SocketLock.lock(SocketLock.java:63)
これは、マシン上の IPv6 設定が原因である可能性があります。実行
sudo sysctl net.ipv6.bindv6only=0
ソケットが同じ呼び出しでホストの IPv6 アドレスと IPv4 アドレスの両方にバインドされるようにします。より永続的な解決策は、/etc/sysctl.d/bindv6only.conf を編集してこの動作を無効にすることです。
Q: WebDriver が要素を見つけられない / ページのロードでブロックしない
A: この問題はさまざまな方法で現れる可能性があります
- WebDriver.findElement(…) が ElementNotFoundException をスローしますが、要素は明らかにそこにあります - DOM を検査すると (Firebug などを使用して) 明らかに表示されます。
- Driver.get を呼び出すと、HTML がロードされるとすぐに戻りますが、onload イベントによってトリガーされた Javascript コードは完了していないため、ページは不完全であり、一部の要素が見つかりません。
- 要素/リンクをクリックすると、新しい要素を作成する操作がトリガーされます。ただし、クリック後に findElement(s) を呼び出しても見つかりません。クリックはブロッキングであるはずではありませんか?
- ページがロードを完了したことをどのように知ることができますか?
説明: WebDriver には、一般的にブロッキング API があります。ただし、条件によっては、ページのロードが完了する前に get 呼び出しが戻る可能性があります。典型的な例は、ページがロードされた後に Javascript が実行を開始することです (onload によってトリガーされます)。ブラウザ (Firefox など) は、基本的な HTML コンテンツがロードされたときに WebDriver に通知します。これが WebDriver が戻るときです。JS コードは将来呼び出される関数をスケジュールしたり、サーバー応答に依存したりする可能性があるため、Javascript の実行がいつ完了したかを知ることは困難 (不可能ではないにしても) です。これはクリックにも当てはまります。プラットフォームがネイティブイベント (Windows、Linux) をサポートしている場合、クリックは OS レベルで要素の座標を持つマウスクリックイベントを送信することによって行われます。WebDriver は、このクリックによって作成される操作の正確なシーケンスを追跡できません。このため、ブロッキング API は不完全です。WebDriver は、テストが続行される前にすべての条件が満たされるのを待つことはできません。それはそれらを知らないからです。通常、重要な問題は、次のインタラクションに関与する要素が存在し、準備ができているかどうかです。
解決策: Wait クラスを使用して、特定の要素が表示されるのを待ちます。このクラスは、要素が見つかる (またはタイムアウトが期限切れになる) まで、NoSuchElementException を毎回破棄しながら、findElement を繰り返し呼び出すだけです。これは多くのユーザーにとってデフォルトで望ましい動作であるため、要素が表示されるのを暗黙的に待機するメカニズムが実装されています。これは、WebDriver.manage().timeouts() 呼び出しを介してアクセスできます。(これは以前、issue 26 で追跡されていました。)
Q: ページ上の任意のイベントをトリガーするにはどうすればよいですか?
A: WebDriver はユーザーのインタラクションをエミュレートすることを目指しているため、API はユーザーがさまざまな要素と対話できる方法を反映しています。
特定のイベントのトリガーは API を使用して直接実現することはできませんが、Javascript 実行機能を使用して要素のメソッドを呼び出すことができます。
Q: 非表示の要素と対話できないのはなぜですか?
A: ユーザーは非表示の要素のテキストを読み取ることができないため、WebDriver もアクセスを許可しません。
ただし、Javascript 実行機能を使用して、要素から直接 getText を呼び出すことは可能です。
WebElement element = ...;
((JavascriptExecutor) driver).executeScript("return arguments[0].getText();", element);
Q: 拡張機能をインストールした状態で Firefox を起動するにはどうすればよいですか?
A
FirefoxProfile profile = new FirefoxProfile()
profile.addExtension(....);
WebDriver driver = new FirefoxDriver(profile);
Q: WebDriver には…してほしいのですが
A: WebDriver に実行してほしいことや、バグを見つけた場合は、issue を追加 してください WebDriver プロジェクトページに。
Q: Selenium サーバーが新しいセッションを開始するのに時間がかかることがありますか?
A: Linux で実行している場合は、セキュアな乱数生成に使用できるエントロピーの量を増やす必要があります。ほとんどの Linux ディストリビューションは、これを行うために「randomsound」と呼ばれるパッケージをインストールできます。
Windows (XP) では、http://bugs.sun.com/view_bug.do?bug_id=6705872 に遭遇している可能性があります。これは通常、一時ディレクトリから多くのファイルをクリアすることを意味します。一時ディレクトリ。
Q: Selenium WebDriver API で TextPresent ? に相当するものは何ですか?
A
driver.findElement(By.tagName("body")).getText()
はページのテキストを取得します。verifyTextPresent/assertTextPresent の場合は、そこからお気に入りのテストフレームワークを使用してテキストをアサートできます。waitForTextPresent の場合は、WebDriverWait クラスを調べたい場合があります。
Q: ソケットロックは悪い設計のように思えます。私はそれを改善できます
A: firefox の起動を保護するソケットロックは、次の設計制約で構築されています。
- すべての言語バインディング間で共有されます。ruby、java、およびその他のバインディングは、同じマシン上で同時に共存できます。
- firefox の起動の特定の重要な部分は、問題のマシンで排他的にロックする必要があります。
- ソケットロック自体は主なボトルネックではなく、firefox の起動がボトルネックです。
SocketLock は Lock インターフェイスの実装です。これにより、独自の実装のためのプラグ可能な戦略が可能になります。別の実装に切り替えるには、FirefoxDriver をサブクラス化し、「obtainLock」メソッドをオーバーライドします。
Q: python で send_keys を使用すると UnicodeEncodeError が発生するのはなぜですか?
A: システムにロケールが設定されていない可能性があります。locale
LANG=en_US.UTF-8 および LC_CTYPE=“en_US.UTF-8” などを設定してください。