6

私は PhantomJS を初めて使用し、phantomjs ドライバーを使用してセレン テスト (python) を実行しようとしていますが、Web 要素は実行されません。

Ghostdriver ログ:

[INFO  - 2015-02-27T15:24:40.236Z] GhostDriver - Main - running on port 52653
[INFO  - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - page.settings - {"XSSAuditingEnabled":false,"javascriptCanCloseWindows":true,"javascriptCanOpenWindows":true,"javascriptEnabled":true,"loadImages":true,"localToRemoteUrlAccessEnabled":false,"userAgent":"Mozilla/5.0 (Macintosh; Intel Mac OS X) AppleWebKit/538.1 (KHTML, like Gecko) PhantomJS/2.0.0 Safari/538.1","webSecurityEnabled":true}
[INFO  - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - page.customHeaders:  - {}
[INFO  - 2015-02-27T15:24:41.075Z] Session [bfd397f0-be94-11e4-ad03-b711254501c8] - Session.negotiatedCapabilities - {"browserName":"phantomjs","version":"2.0.0","driverName":"ghostdriver","driverVersion":"1.2.0","platform":"mac-10.9 (Mavericks)-64bit","javascriptEnabled":true,"takesScreenshot":true,"handlesAlerts":false,"databaseEnabled":false,"locationContextEnabled":false,"applicationCacheEnabled":false,"browserConnectionEnabled":false,"cssSelectorsEnabled":true,"webStorageEnabled":false,"rotatable":false,"acceptSslCerts":false,"nativeEvents":true,"proxy":{"proxyType":"direct"}}
[INFO  - 2015-02-27T15:24:41.075Z] SessionManagerReqHand - _postNewSessionCommand - New Session Created: bfd397f0-be94-11e4-ad03-b711254501c8
[ERROR - 2015-02-27T15:24:47.242Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1425050687190

  :262 in error

興味深いのは、phantomjs を正常にインストールした後、ログイン テストを実行したところ、問題なく合格したことです。次に、上記と同じ理由で失敗した別のテストを実行しました。合格した Login テストを再度実行しようとしましたが、phantomjs ドライバーは要素を見つけられなくなりました。

これの原因は何ですか?

ちなみに、これらのテストは chrome と FF で問題なく動作します。

4

3 に答える 3

3

つまり... Selenium WebDriver Wait を使用する要素は、実際にはポーリング方式を使用しているようです。Selenium の明示的な待機は、コードをさらに進める前に、特定の条件が発生するのを待機するように定義するコードであることに注意してください。デフォルトでは、WebDriverWait は正常に戻るまで 500 ミリ秒ごとに ExpectedCondition を呼び出します。(参照。 ) つまり、500 ミリ秒ごとに、Selenium は待機状態をテストします。true の場合は、続行します。まだ true でない場合は、別のポーリング頻度サイクルを待ってから、再試行してください。

そして、私のテストから、ポーリングテストとまだ準備ができていないので、それを失敗と呼ぶと、ghostdriver.logに間違いなくエラーが生成されると私は信じています

[ERROR - 2016-08-14T08:50:12.896Z] WebElementLocator - _handleLocateCommand - Element(s) NOT Found: GAVE UP. Search Stop Time: 1471164612878

複雑な単一ページの AJAX サイトをスクレイピングするプロジェクトに取り組んでいます。このサイトは共通の div 要素を再利用するため、取得するために、非常に多くの呼び出し (クリア、値の貼り付け、クリック、待機、ページ上の別のテーブルへの移動、目的のデータのコピー、繰り返し...) を行う必要があります。私が必要とするデータ。そして、サイトはちょっと遅いので、次の方法で待機要素を適用します。

driver.wait.until(EC.presence_of_element_located((By.XPATH, "//*[@id='special_content_id']//td[contains(.,'" + info.unitId + "')]")))

クラスでポーリング頻度が設定されていることが判明selenium.webdriver.support.wait.WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)

ここを参照してください。

挙動が気になりました。poll_frequency を 0.5 秒に設定すると、98 個の WebElementLocator エラーを受け取りました。それを 7.5 秒に切り替えたところ、driver.wait = WebDriverWait(driver, 60, 7.5)36 個のエラーしか受信しませんでした。ポーリング時間が短いほど、より多くのエラーが生成されます。

私が本当に奇妙だと思うのは、通常のポーリング動作 (Selenium) がログエラーをどこかに設定する (PhantomJS) とは思わないということです。ポーリング用の別のログ エントリがあればいいのにと思いますが、まだ準備ができていません...

于 2016-08-14T21:53:49.367 に答える
0

セレン テストは、ロードされる前に要素を見つけようとする可能性があります。最初の試行が失敗した後は、要素が見つかるかタイムアウトを超えるまで、何度も試行して続行する必要があります。

splinter を参照してください https://splinter.readthedocs.org/en/latest/index.html Selenium で動作し、要素を待機するロジックを実装しています。

于 2015-02-27T16:50:36.190 に答える
0

JavascriptExecutor を使用して JavaScript でアクセスできる phantomJS ドライバーによる find_element メソッドを使用して、これらの要素がテスト ケースに配置されていないことに気付きました。要素にアクセスし、要素に対するアクションを実行するには、java スクリプトを使用します。これで問題が解決することを願っています。

于 2015-02-27T16:21:19.710 に答える