2017-03-26 11 views
1

セレンのクリックごとに3秒の遅延を実行するにはどうすればよいですか?たとえば、私はこのコードを持っており、ページの読み込みに3秒かかることがあります。改ページのボタンをクリックしますセレンのクリックの遅延C#

for(int i = 1; i<6; i++) 
{ 
    driver.FindElement(By.XPath(".//*[@id='injectview']/div/div/div/table[2]/tbody/tr/td[1]/ul/li["+ i +"]/a")).Click(); 
} 

答えて

3

非同期(async)を使用することです。ページがそれまでにロードが完了していない場合はどうなりますか?ページが3秒以上読み込まれるとどうなりますか?より良い方法は、WebDriverWaitを使用してページの読み込みを待機することです。

  1. ページネーションのリンクをクリックしてください:

    WebDriverWait wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(3)); 
    for (int i = 1; i < 6; i++) 
    { 
        By locator = By.XPath(".//*[@id='injectview']/div/div/div/table[2]/tbody/tr/td[1]/ul/li[" + i + "]/a"); 
        IWebElement element = Driver.FindElement(locator); 
        element.Click(); 
        wait.Until(ExpectedConditions.StalenessOf(element)); 
        wait.Until(ExpectedConditions.ElementToBeClickable(locator)); 
    } 
    

    ロジックはこのようなものです。

  2. 改ページリンクが古くなるのを待ちます。 Staleは、その要素が新しいページがロード中であることを示すDOM内になくなったことを意味します。
  3. 新しいページに読み込みが完了したことを示す要素がクリック可能になるのを待ちます。
  4. リンクごとに1〜3を繰り返します。

注:あなたのXPathは、ネスティングの多くのレイヤーで壊れやすいでしょう。あなたがナビゲーションリンクの周りにHTMLを提供するなら、私はたぶん壊れにくいロケータを作ることができます。

+1

JeffCありがとうございます。 –

0

あなたはそれが各呼び出しの完了を待つ必要がありますwait.until(...);で全体の要求をラップすることができます。私の意見では

+0

'Thread.Sleep()'は悪い習慣です。 – JeffC

+0

うん、私は編集します。 –

+0

さて、あなたは 'Thread.Sleep()'を削除しましたが、私はあなたの答えが役に立つとは限らないと思います。 「要求全体を包む」とはどういう意味ですか?あなたはOPのコードを持っていて、それを受け取り、あなたの推薦を使って彼が使うべき最終回答を投稿します。 – JeffC

-1

クリーナーソリューションは、それが唯一の時間のハードコーディングされた値をお待ちしておりますので、Thread.Sleep()を使用しないでください

for(int i = 1; i<6; i++) 
{ 

    await PutTaskDelay(); 
    driver.FindElement(By.XPath(".//*[@id='injectview']/div/div/div/table[2]/tbody/tr/td[1]/ul/li["+ i +"]/a")).Click(); 
} 

async Task PutTaskDelay() 
     { 
      await Task.Delay(3000); 
     } 
+1

これは本当に悪い習慣である 'Thread.Sleep()'と全く違うものではありません。 – JeffC