2017-03-10 6 views
3

私はフォームを記入して結果を得るウェブスクレイピング用のwatir webドライバを使用しています。結果には、現在選択されているテキストを抽出する必要があるドロップダウンリストも含まれています。私は以下のクエリを使用しました。私は次のクエリを使用することができます。このことからWatirウェブドライバが選択項目をドロップダウンするのに時間がかかりすぎる

selectedList = browser.select_list(:id => "itemType") 

:このクエリを使用して

selectedText = selectedList.selected_options.map(&:text)[0] 

を、私が選択したテキストを取得することができています。しかし問題は、ドロップダウンリストには何千ものオプションが含まれており、このクエリを使用して選択されたオプションを見つけるには時間がかかりすぎるということです。

これより高速な方法があれば幸いです。 はまた、私は次のクエリを試してみました:

selected = selectedList.selected_options()[0] 
selectedText = selected.text 

しかし、問題は同じです。私はこれらのクエリの両方が良好に実行されているが、何千ものオプションを持つ、より小さいオプションを持つ他のドロップダウンを持っています。

答えて

2

問題は、選択したオプションを取得するために、個々のオプションごとにブラウザを呼び出すことです。たとえ各通話が1秒間を要し​​ても、それは非常に迅速に加算されます。

あなたはexecute_scriptを使用して、単線のコールで選択したオプションを得ることができます:ちょうど1000年のオプション選択リストのページについては

selected_list = browser.select_list(id: 'itemType') 
selected_options = browser.execute_script("return arguments[0].selectedOptions;", selected_list) 
selected_text = selected_options.map(&:text) 

を、これはわずか0.2秒に64秒から実行時間を落としました。

上記はドロップダウンとマルチ選択の両方で機能します。これは、0.08秒に半分の時間を削減

selected_list = browser.select_list(id: 'itemType') 
selected_text = browser.execute_script("return arguments[0].selectedOptions[0].text;", selected_list) 

:あなたはそれがドロップダウン(すなわち、単一選択オプション)であることがわかっている場合、あなただけのテキスト(というよりも、選択したオプションの集合)を返すことによってさらに速く得ることができます。しかし、そのような小さな利益のために、JavaScriptコードを最小限に抑えるので、私は個人的に最初のアプローチを好みます。

+0

このような優れた回答! – RAJ

+0

@Justin Ko:あなたの偉大な答えをありがとう、魅力のように動作します。 – Dharma

+3

私は、このオプションを評価するためにSeleniumを使用しても、別の利点があるとは思わないので、このjavascriptソリューションがWatirのデフォルトの実装であることを提案するこのPR(https://github.com/watir/watir/pull/540)を作成しました。正解であるかどうかは分かりませんが、この代替案を提示していただきありがとうございます。 – titusfortner

関連する問題