2017-06-12 37 views
1

ページがAJAXを使用しているときに、暗黙的および明示的な待機を使用できますが、十分な要素がロードされているときにdriver.get()によって発生したロードを停止します。ページの読み込みが完了したときにのみdriver.get()呼び出しが返るため、これを行うことは可能ですか?Selenium python:特定の要素が読み込まれたときにページの読み込みを停止する方法は?

+0

今、なぜあなたは、このようなことをするだろう、あなたが表示するボタンのを待つとしましょう。ボタンが表示されたら、あなたが望むものを何でもして、それがあなたのコマンドを実行する前にページが完全にロードされるのを待たずに、それが他の理由であれば無駄です。 –

+0

@ElvirMuslicただし、driver.get()の呼び出しは、ページのロードが完全に終了したときにのみ戻されます。ボタン全体が読み込まれるのを待たずにボタンが表示されたら、そのボタンをプログラムでクリックしたいと思うようです。 – RamKumar

+0

実際、driver.get()は、ロードする要素を待つのではなく、単に要求を行います。 driver.something.click()は、ページに関する応答を取得するとすぐにそれを実行し、要素が存在しない場合はエラーをスローします。 意味、1.driver.get()はページからの応答を待ちます(すべてではありません)。 2.あなたは何かを実行することができ、ページを完全にロードする必要はありませんが、それらのアクションを実行している間はロードされます。 3.これは時間と使用量を節約するために使用できます(大きなプロジェクトの場合) –

答えて

5

はい、pageLoadStrategy機能をnoneに設定すると可能です。そして、要素存在すると読み込みを停止するよう​​をコールするのを待つ:

from selenium import webdriver 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.by import By 

capa = DesiredCapabilities.CHROME 
capa["pageLoadStrategy"] = "none" 

driver = webdriver.Chrome(desired_capabilities=capa) 
wait = WebDriverWait(driver, 20) 

driver.get('http://stackoverflow.com/') 

wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#h-top-questions'))) 

driver.execute_script("window.stop();") 
+0

このコードをローカルで実行したければ、ローカルで何をする必要がありますか?依存関係の要件は理解していますが、上記のテストでchromedriverを指摘する必要がありますか?言語バインディングなしで上記をどのように実行しますか? – Wunderbread

+0

@Wunderbread、私はあなたが "言語バインディングなし"を意味するのかどうかはわかりませんが、コードをローカルで実行するには、chromeriverを 'PATH'環境変数に置くか、コンストラクタへのパスを渡してください(' webdriver.Chrome ')。 –

+0

ありがとう、ありがとう。私が意味していたことはフレームワークなしで上記のテストを実行することです。コマンド "pytest test_foo.py" – Wunderbread

関連する問題