web-dev-qa-db-ja.com

Selenium Webdriverのタイムアウトを設定するにはどうすればよいですか?

FirefoxDriverのようなwebdriverでプロキシを使用している場合、プロキシが不良な場合、getメソッドは永久にブロックされます。いくつかのタイムアウトパラメータを設定しましたが、うまくいきませんでした。

これは私のコードです:

FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("general.useragent.override", ua);    
Proxy p = new Proxy();
p.setHttpProxy(proxy);
profile.setProxyPreferences(p);
profile.setEnableNativeEvents(true);

// create a driver
WebDriver driver = new FirefoxDriver(profile);
driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
driver.manage().timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
driver.get("www.sina.com.cn")

Driver.getの呼び出しは永遠にブロックされますが、30秒待機し、ページがロードされていない場合は例外をスローします。

33
福气鱼

これを試して:

 driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
26
Fujiao Liu

timeouts()メソッドは、一部のドライバーでは実装されておらず、一般的に非常に信頼できません。
タイムアウトに別のスレッドを使用します(URLを渡してスレッド名としてアクセスします):

    Thread t = new Thread(new Runnable()
    {
      public void run()
      {
        driver.get(Thread.currentThread().getName());
      }
    }, url);
    t.start();
    try
    {
      t.join(YOUR_TIMEOUT_HERE_IN_MS);
    }
    catch (InterruptedException e)
    { // ignore
    }
    if (t.isAlive())
    { // Thread still alive, we need to abort
      logger.warning("Timeout on loading page " + url);
      t.interrupt();
    }

これはほとんどの場合うまくいくように見えますが、ドライバーが本当にスタックしていて、その後のドライバーへの呼び出しがブロックされる可能性があります(WindowsでChromeドライバーでそれを経験します)。 driver.findElements()呼び出しがブロックされる可能性があるのと同じくらい無害です。

25
user1102631

試してみる

driver.executeScript("window.location.href='http://www.sina.com.cn'")

このステートメントはすぐに戻ります。

その後、タイムアウトでWebDriverWaitを追加して、ページタイトルまたは任意の要素に問題がないかどうかを確認できます。

これがお役に立てば幸いです。

8
JasonYou

私は同じ問題を抱えていましたが、このフォーラムと他の人のおかげで答えを見つけました。最初は別のスレッドも考えていましたが、コードが少し複雑になります。そこで私は、「優雅さとシンプルさ」という原則と一致する答えを見つけようとしました。

そのようなフォーラムをご覧ください: https://sqa.stackexchange.com/questions/2606/what-is-seleniums-default-timeout-for-page-loading

解決策:コードでは、 'get'メソッドを含む行の前に、たとえば次のように使用できます。

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS);

1つは、timeoutExceptionがスローされるため、try catchブロックにカプセル化するか、何らかのメソッドでラップする必要があるということです。

PageLoadTimeoutのgetterが見つからなかったため、デフォルト値はわかりませんが、スクリプトが何時間もフリーズし、何も前進しなかったため、おそらく非常に高い値です。

注意: 'pageLoadTimeout'はChromeドライバーには実装されていないため、例外が発生します。ユーザーが作成する計画があるというコメントを確認しました。

5
Lukasz

このようにHTTPクライアントでタイムアウトを設定できます

int connectionTimeout=5000;
int socketTimeout=15000;
ApacheHttpClient.Factory clientFactory = new ApacheHttpClient.Factory(new HttpClientFactory(connectionTimeout, socketTimeout));
HttpCommandExecutor executor =
      new HttpCommandExecutor(new HashMap<String, CommandInfo>(), new URL(seleniumServerUrl), clientFactory);
RemoteWebDriver driver = new RemoteWebDriver(executor, capabilities);
2
flob

追加

driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

何もしません。ページは非常に長い時間ブロックされます。

1
zhongting

Driver.manage()。timeouts()。pageLoadTimeout(10、TimeUnit.SECONDS)のソリューションは、同期読み込みのあるページで機能しますが、非同期で読み込みを行うページの問題は解決しません。テストはすべて失敗しますpageLoadTimeOutを設定した場合の時間。

1
sou

特にInternet Explorerの場合、タイムアウトコールは実際には十分に信頼できないことがわかりましたが、次の解決策が役立つ場合があります。

  1. Seleniumプロセスを実行しているjunitテストで@Test(timeout = 10000)を使用して、完全なテストをタイムアウトできます。これにより、ショー全体をブロックするのではなく、他のテストを実行するためのメインスレッドが解放されます。ただし、これでも機能しない場合があります。

  2. とにかくタイムアウトすることで、テストケースをサルベージするつもりはありません。1回の操作でもタイムアウトになると、テストシーケンス全体が一貫性のない状態になる可能性があるためです。ブロックせずに他のテストケースを続行する(または同じテストを再試行する)ことができます。このような場合、絶対確実な方法は、10分以上実行されているWebdriverのプロセス(IEDriverServer.exe、Phantomjs.exeなど)をポーリングするポーラーを作成し、それらを強制終了することです。例は 処理時間が長いプロセスを自動的に識別(および強制終了) で見つけることができます。

0
premganz

同様の状況で以下のコードを使用

driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);

try catchにdriver.getコードを埋め込み、1分以上かかっていたページの読み込みの問題を解決しました。

0
Manjunath24