2017-07-06 3 views
1

私が取り組んでいる会社のウェブサイトのページ読み込み時間を正確に検出しようとしています。私はそれを自動化できるように、これをPythonとSeleniumを使って試してみることに決めました。しかし、私は信頼できるページの読み込み時間を得ることができないので、壁にぶつかったようです。この犯人は、〜3秒のajax呼び出しが終了するまで、ページが「読み込まれた」とはみなさないという事実のようです。しかし、SeleniumはDOMが完全にロードされる前にロードされたページを考慮します。ロード時間ではありません。私はオンラインで読みました。WebDriverWait関数を使用して、ajaxの実行後に表示される要素をポーリングできます。私は新しい要素がajax呼び出しの後に作成されるのでこれを行うことができるはずですが、私はそれが500ミリ秒のポーリング頻度を持っていることをオンラインで気付きました。私は非常に正確にページの読み込み時間を決定しようとしています、そして500msは大きな誤差のマージンです。私はPythonでデフォルトのポーリング頻度を変更する方法についてオンラインで何かを見つけることができませんでした。ポーリング頻度を大幅に減らす方法や、Ajaxで正確なページの読み込み時間を50ms程度の誤差の範囲で取得する方法がわかっている場合は、教えてください。ありがとうございました。私のプロジェクトの一つでPythonでAJAX読み込み時間のページをSeleniumで正確に検出する

答えて

0

私はこのような関数を書いた:

def wait_for(condition_function, *args): 
    start_time = time.time() 
    while time.time() < start_time + 10: 
     if condition_function(*args): 
      return True 
     else: 
      time.sleep(0.1) 
    raise TimeoutException(
     'Timeout waiting for {}'.format(condition_function.__name__) 
    ) 

後でこのようにそれを使用する:login_btnはセレンオブジェクトであり、obj_has_gone_staleをしようとする機能である

wait_for(obj_has_gone_stale, login_btn) 

オブジェクトを見つけてStaleElementReferenceExceptionをキャッチします。それは次のようになります。

def obj_has_gone_stale(obj): 
    try: 
     # poll the link with an arbitrary call 
     obj.find_elements_by_id('doesnt-matter') 
     return False 
    except StaleElementReferenceException: 
     return True 

あなたが望む任意の時間をwait_for内部time.sleep()を設定することができますこの方法で。しかし、obj.find_elements_by_id('doesnt-matter')も実行に時間がかかることを忘れないでください。確かに、セレンの組み込みがwait for presenceのほうがずっと良ければ、objが消えて出現しないようなシナリオではwait_forと書きました。しかし、obj_has_gone_staleではなくobj_has_renderedのようなものを書くことができます。基本的にはobjにアクセスし、ページにレンダリングされているかどうかを確認してtrueを返します。次に関数をwait_forに渡します。

関連する問題