2016-12-15 15 views
0

私はPythonとSeleniumを使ってウェブサイトを移動しています。Python/Seleniumでトリッキーなドロップダウンオプションを選択

ページでは、一連の5つのドロップダウンボックスを使用して作業を進めています。各ドロップダウンボックスのオプションは、前のドロップダウンから選択した内容に基づいて動的に生成されます。

私はユーザーが状態を選択する必要がある3番目のドロップダウンに固執しています。以下のように...

<select name="state" class="pulldown" id="state" onchange="[javablob]"> 
<option value="">Select a State</option> 
<option value='AK_N'>    AK</option> 
<option value='AL_N'>    AL</option> 
<option value='AR_Y'>    AR</option> 

:ロードされたとき は、検査さHTMLは次のようになります。

これまでの私のコードは次のとおりです。

waitforstate = WebDriverWait(driver,30).until(EC.presence_of_element_located((By.ID,"state"))) 
driver.implicitly_wait(10) #added because the ID is found but the states aren't loaded yet 
state = Select(driver.find_element_by_id('state')) 

しかし、私が欲しいの状態が動作しない選択:

state.select_by_visible_text("TN") 

は...

これを行う
Message: Given xpath expression ".//option[normalize-space(.) = "TN"]" is invalid: 
WrongDocumentError: Node cannot be used in a document other than the 
one in which it was created 

を与えます

state.select_by_value("TN_Y") 

から状態を選択するためのインデックスがない...

Message: Given css selector expression "option[value ="TN_Y"]" is invalid: 
TypeError: can't access dead object 

を与えます。

私はオプションがロードされているものを表示するようにしてみてください。

all_options = state.options 
for option in all_options: 
    print("Value is: %s" % option.get_attribute("value")) 

...何も印刷ではなく、さらにデフォルトのオプション。エラーなしで実行されて...

state.select_by_visible_text("Select a State") 
print "Select a state selected" 
state._unsetSelected 
print "Now it's unselected" 

:しかし、私がこれを使用して、デフォルトのオプションを選択して、選択解除することができます表示されます。

私は、それが処理されたか確認するために、ページを移動するには、FirefoxのセレンIDEを使用し、私が何をしないのですid=state, label=TN.

でそれを選択することができましたか?

答えて

0

JavaScriptのレンダリングされたページをスクラップするときに、phantomjsやその他のWebkitライブラリがより便利です。 Webブラウザとのやりとりを完全に再現することができるため、スクレイパーの実装をより予測しやすくなります。

私は個人的にスクレイピングの目的でセレンとファントムを使用します。

phantomjs:https://realpython.com/blog/python/headless-selenium-testing-with-python-and-phantomjs/

のpython-のqt4: https://impythonist.wordpress.com/2015/01/06/ultimate-guide-for-scraping-javascript-rendered-web-pages/

+0

ありがとうございました。私はこれらのツールがこのような状況でどのように機能を追加するのか分かりません。私の問題はそれ自体が擦り傷ではなく、ドロップダウンフォームを完成させる必要があるスクレイプページにナビゲートしています。 – Suzanne

+0

私は状態のドロップダウンリストがjavascriptで作成されていると思う。私が言ったように、javascriptのレンダリングされた要素は、セレンとは異なって読み込まれなければなりません。この投稿をチェックしてください:http://stackoverflow.com/a/22739613/5808505 –

+0

ありがとうございます。そのメソッドは、私が使っていたメソッドと同じHTMLを、この特定のインスタンスで生成します。それが判明したので、私のエラーは、javascriptで生成された完全なオプションリストをロードするのに十分長い間待機していませんでした。 'driver.implicitly_wait(10)'は十分に待たずに 'sleep(5)'がしました。 – Suzanne

関連する問題