Selenium 2.リモートコントロールとWebdriver

Selenium 2 Webインターフェイス機能テスト自動化ツールには、Selenium Remote Control(Selenium 1)とWebdriverの2つの製品が含まれています。

RCとWebdriverは、RCがSelenium Coreを使用してブラウザーと対話するという点で異なります。SeleniumCoreは、JavaScriptを介して任意のブラウザーで動作できる特別なツールです。 Webdriverはネイティブインターフェイスを使用するため、ユーザーアクションをより正確に繰り返すことができますが、個々のブラウザーと対話するには、特別なドライバーが必要です(各ブラウザーには独自のネイティブインターフェイスがあるため)が、同時にテストの速度が向上します。 現時点では、次のようなドライバーがあります。







ネイティブインターフェイスを使用すると、非常に不便です。通過中のキーストロークは、テストを「クラッシュ」させる可能性があります。



Selenium RCの長所と短所の両方は、Selenium Server Standaloneの使用です。 一方では、サーバーを使用すると結果のログが簡単になり、自動テストの記述が大幅に簡単になります(テストの速度のために視覚的に判断できない場合があるため、エラーが発生した場所を正確に見つけるためにWebdriverにさまざまな「クランチ」を配置する必要があります)パーティ-テストにかかる時間が長くなり、モバイルデバイスでページをテストするために使用できなくなります。



従来のRCと比較したWebdriverの不利な点は、マウス上でのホバリングなどのアクションのシミュレーションが難しいことです。 一方、Webdriverは、実際のユーザーのように、非表示の要素を操作したり、たとえば、別の要素で完全に覆われたフィールドにテキストを入力したりすることはできません。



JavaScriptとAJAXの操作についても説明する必要があります。 Webdriverは、AJAXリクエストの完了のための待機メカニズムを実装しています:明示的な待機(明示的な期待)および暗黙的な待機(暗黙的な期待)(詳細はWebdriverでの期待 )。 RCでは、プログラミング言語ツールを使用してAJAXを待機する必要があります。 また、Remote Controlは常にJSで正しく動作するとは限らないことにも注意してください。 たとえば、selenium.clickはonMouseDownでJMイベントを呼び出すことができず、「開発者はそこで何を使用したのか」と疑問に思う必要があります。正しいコマンドを書くには。 Webdriverでは、このような問題は発生しません。



Selenium Remote Controlでは、開発の過程でかなり幅広いコマンドセットが形成されましたが、Webdriverでは、ほとんどすべてが.clickまたは.sendKeysになります(ただし、一般的に、実際のユーザーはスクリーンショットを撮ったり、ダイアログで[OK]または[キャンセル]を選択しても問題はありません)。 ただし、Webdriverには、ページ上の要素を見つけるためのロケーターがさらにあります。



By.id-IDで要素を参照します。

By.name-名前要素の名前によってアクセスされます:

By.xpath-xpath式によって要素にアクセスします。

By.tagName-HTMLタグ名で検索。

By.cssSelector-このタイプのロケーターはスタイルシート記述(CSS)に基づいています。

By.className-要素のCSSクラスによる検索。

By.linkTex-テキスト内のリンクを検索します。

By.partionalLinkText-テキストの一部でリンクを検索します。



RCとWebdriver(Java)でのテストの例を考えてみましょう。



Googleに行く自動テストを作成し、検索バーにzerg rushと入力し、検索ボタンをクリックして、少し待ってからウィンドウのスクリーンショットを撮ります。



リモコン:



import org.openqa.selenium.Keys; import com.thoughtworks.selenium.SeleneseTestCase; import java.util.concurrent.TimeUnit; import java.awt.event.KeyEvent; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.Writer; public class FirstTest extends SeleneseTestCase { public void setUp() throws Exception { setUp("http://google.com", "*firefox"); } public void testGoogle() throws Exception { File file = new File("    "); if (file.exists()) { file.delete(); } selenium.open("/"); //   Google selenium.windowMaximize(); //     selenium.waitForPageToLoad("30000"); //   selenium.type("name=q", "zerg rush"); //     selenium.click("name=btnG"); //   TimeUnit.SECONDS.sleep(5); // 5  selenium.captureEntirePageScreenshot("   ", ""); Writer output = new BufferedWriter(new FileWriter(file)); output.write(selenium.getLog()); output.close(); System.out.println("Test Complete"); //    } }
      
      







Webdriver



 import java.util.regex.Pattern; import java.util.concurrent.TimeUnit; import org.junit.*; import static org.junit.Assert.*; import static org.hamcrest.CoreMatchers.*; import org.openqa.selenium.*; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.support.ui.Select; import java.awt.event.KeyEvent; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.Writer; import org.apache.commons.io.FileUtils; public class First_test { private WebDriver driver; private String baseUrl; private StringBuffer verificationErrors = new StringBuffer(); @Before public void setUp() throws Exception { driver = new FirefoxDriver(); baseUrl = "http://google.com"; driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); //   } @Test public void testGoogle() throws Exception { driver.get(baseUrl + "/"); //   Google.     baseUrl driver.findElement(By.name("q")).sendKeys("zerg rush"); //     driver.findElement(By.name("btnG")).click(); //   TimeUnit.SECONDS.sleep(5); // 5  File file = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); String path = "   "; FileUtils.copyFile(file, new File(path)); System.out.println("Test Complete"); //    } @After public void tearDown() throws Exception { driver.quit(); String verificationErrorString = verificationErrors.toString(); if (!"".equals(verificationErrorString)) { fail(verificationErrorString); } } private boolean isElementPresent(By by) { try { driver.findElement(by); return true; } catch (NoSuchElementException e) { return false } } }
      
      







上記から、リモートコントロールとWebdriverの両方に欠点と利点の両方があることがわかります。 多くの場合、RCを使用する方が便利です。 大量のコマンドと隠された要素を操作する機能、およびサーバーログを受信する機能は、テストの記述とその後の適応プロセスを大幅に簡素化および高速化します(時は金なり)。 Webdriverは、RCが(不十分な管理)できない場所、たとえばAJAXリクエストでオーバーロードされたWebインターフェイス、またはユーザーアクションを正確にシミュレートすることが非常に重要な場所で使用するのに適しています(新しいWebの登場により、Webdriverが導入されたことに注意する必要があります)技術Selenium RCは単純に使い果たされており、代替アプローチの必要性が明らかになりました。



Selenium 2には、RCからWebdriverに切り替える機能もあります。 オフィスで詳細に説明されています。 ドキュメント。



All Articles