3

以下のように、Selenium を使用した TestMethod があります。

 [TestMethod]
        public void ShouldSendPasswordReminder()
        {
            // go to loginregister url
            _fireFoxWebDriver.Navigate().GoToUrl(UkPaBaseUrl + "loginregister.aspx");
            Thread.Sleep(1000);

            // click the forgotten password
            _fireFoxWebDriver.FindElement(By.LinkText("Forgotten your password?")).Click();
            Thread.Sleep(1000);

            // enter your email address

            _fireFoxWebDriver.FindElement(By.Id("PasswordResetRequest1_PasswordResetRequest_Username"))
                .SendKeys("username.lastname@domain.com");
            Thread.Sleep(1000);

            // click submit
            _fireFoxWebDriver.FindElement(By.Id("PasswordResetRequest1_PasswordResetRequest_PasswordResetRequestSubmit")).Click();
            Thread.Sleep(5000);

            // assert
            Assert.IsTrue(_fireFoxWebDriver.Url.Contains("ThankYou"));
        }

ご覧のとおり、Thread.Sleep を何度も呼び出さなければなりません (ページが javascript などによって処理を完了するのに時間がかかる場合があるため)。Selenium が処理できないように見えるため、ほぼ各アクションの後にページの読み込みと遅延は、WatiN とは異なります。

これにより、コードがかなり見苦しく、信頼性が低くなります。

そのようなシナリオを処理するためのより良い方法は何ですか? テストでも Thread.Sleep 呼び出しを頻繁に記述しますか?

ありがとう、

4

3 に答える 3

3

FindElement()管理機能を使用して、失敗するまで待機する基準時間を設定できます。

_fireFoxWebDriver.Manage()
                 .Timeouts()
                 .ImplicitlyWait(TimeSpan.FromSeconds(1000));
于 2012-01-26T17:22:28.553 に答える
2

明示的な待機。公式ドキュメント ( http://www.seleniumhq.org/docs/0.. .) によると、明示的な待機の最悪のケースは Thread.sleep() です。

明示的な待機では、最大時間が経過するのを待たずに、指定された最大時間が経過する前にその条件が発生した場合、条件が発生するとすぐに処理が続行されます。したがって、最大時間まで待機する必要がある (指定された最大時間中に条件が発生しなかったため) ことは、明示的な待機の最悪のケースです。

Thread.sleep() は、明示的な待機の最悪のケースと見なされると思います。Thread.sleep() の場合、先に進む前に、Thread.sleep() の引数として指定された時間だけ待機する必要があるためです。

Thread.sleep() が暗黙の待機ではない理由を考えるかもしれません。それは Thread.sleep() の効果が明示的な待機のように書かれた場所だけにあるからだと思います。ただし、暗黙的な待機の効果は、ドライバー インスタンスの有効期間全体です。

**JAVA**
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")));

**C#**
using (IWebDriver driver = new FirefoxDriver())
{
driver.Url = "http://somedomain/url_that_delays_loading";
WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));
IWebElement myDynamicElement = wait.Until<IWebElement>(d => d.FindElement(By.Id("someDynamicElement")));
}

これは、TimeoutException をスローする前に最大 10 秒待機するか、要素が見つかった場合は 0 から 10 秒でそれを返します。

私のサンプル コード、私のテスト ケースでは、最大 10 秒待機する必要がありました。以前は、Thread.Sleep を使用して次の要素を見つける前に 10 秒待機していました。今は WebDriverWait を使用しているので、要素が見つかった場合は処理を進めます。これにより、日々のアクティビティが高速化され、時間も節約されます。

using (IWebDriver driver = new ChromeDriver(options))
        {
            TimeSpan t = TimeSpan.FromSeconds(10);
            WebDriverWait wait = new WebDriverWait(driver,t);
            try
            {  
                driver.Navigate().GoToUrl("URL");
                //IWebElement username = driver.FindElement(By.Name("loginfmt"));
                IWebElement username = wait.Until(ExpectedConditions.ElementIsVisible(By.Name("loginfmt")));                                      
                username.SendKeys(dictionaryItem);
                //Thread.Sleep(10000); Removed my Thread.Sleep and tested my wait.Until and vola it works awesome.
                IWebElement next = wait.Until(ExpectedConditions.ElementIsVisible(By.Id("idSIButton9")));
                //IWebElement nextdriver.FindElement(By.Id("idSIButton9"));
                next.Click();
于 2016-12-22T00:53:58.430 に答える
0

スクリプトがアプリよりも速くなったときに遅延を導入することに関する私の一般的なヒューリスティックは、私が何を待っているのかを本当に考えることです。私の意見では、睡眠タイプの呼び出しは、実際に時間が経過するのを待っている場合にのみ適切です。自動タイムアウトをテストしていた場合、実際には特定の時間が経過するのを待っているため、Thread.sleep タイプの呼び出しを含めるのが理にかなっている場合があります。ただし、通常は、ページのロード、JavaScript の実行など、他のことが発生するのを待っています。このような場合、一定の時間待機することで、潜在的に複雑なチェックを回避できるように見える簡単な方法になります。私が実際に待っているもののために。ただし、これには複数の落とし穴があります。テストが遅くなりすぎている可能性があります (上記の各待機が 200 ミリ秒で済む場合、たとえば、上記の短いスニペットでさえ、余分に 2.5 秒かかります (最後の 5 秒の待機を調整していません)。それ自体は大したことではないように思えるかもしれませんが、スイートが大きくなるにつれて合計されます.) 別の落とし穴は、低速のマシンに移動した場合や、環境によってアプリの速度が低下した場合に発生します。パスワード?1 台のマシンでリンクします。テストは失敗しますが、それでもアプリのパフォーマンスしきい値の許容範囲内である可能性があるため、偽の失敗が発生します。これは、単に待機時間を増やすことで対処されることが多いのですが、これは、もう一度述べた最初の落とし穴につながります。それ自体は大したことではないように思えるかもしれませんが、スイートが大きくなるにつれて合計されます.) 別の落とし穴は、低速のマシンに移動した場合や、環境によってアプリの速度が低下した場合に発生します。パスワード?1 台のマシンでリンクします。テストは失敗しますが、それでもアプリのパフォーマンスしきい値の許容範囲内である可能性があるため、偽の失敗が発生します。これは、単に待機時間を増やすことで対処されることが多いのですが、これは、もう一度述べた最初の落とし穴につながります。それ自体は大したことではないように思えるかもしれませんが、スイートが大きくなるにつれて合計されます.) 別の落とし穴は、低速のマシンに移動した場合や、環境によってアプリの速度が低下した場合に発生します。パスワード?1 台のマシンでリンクします。テストは失敗しますが、それでもアプリのパフォーマンスしきい値の許容範囲内である可能性があるため、偽の失敗が発生します。これは、単に待機時間を増やすことで対処されることが多いのですが、これは、もう一度述べた最初の落とし穴につながります。ただし、それはまだアプリのパフォーマンスしきい値の許容範囲内である可能性があるため、偽の失敗が発生しています。これは、単に待機時間を増やすことで対処されることが多いのですが、これは、もう一度述べた最初の落とし穴につながります。ただし、それはまだアプリのパフォーマンスしきい値の許容範囲内である可能性があるため、偽の失敗が発生しています。これは、単に待機時間を増やすことで対処されることが多いのですが、これは、もう一度述べた最初の落とし穴につながります。

このサイクルから抜け出すには、待っているときにできるだけ具体的にすることが非常に重要だと思います。Selenium は、特定の条件が満たされるまで待機するために使用できる Wait クラスを提供します。.Netバインディングにそれが含まれているかどうかはわかりませんが、それを期待して使用します。Ruby バージョンでは、Wait にコードのブロックを与えます。これは、要素の存在またはチェックする必要があるその他すべてを探すことができます。wait メソッドは、タイムアウト値と間隔値を取り、ブロックが true を返すか、タイムアウト期間が経過するまで、interval 秒ごとにブロックを実行します。このようなクラスを設定すると、パフォーマンス スケールの下限を処理するのに十分なタイムアウト値を設定できますが、特定の実行で実際に必要な時間よりも長く待機するというペナルティが発生することはありません。

于 2012-01-26T19:21:54.590 に答える