2016-10-10 37 views
1

私はPythonを初めて使いましたが、これを行う方法について過去1時間を探しています。私は、折りたたみ(ドロップダウン)メニューですべてのカテゴリを開き、Ctrl + Tを今アクティブなクラス内のすべてのリンクを開く必要があります。ブラウザが開き、すべてのカテゴリも開いていますが、アクティブなリンクが新しいタブで開かれることはありません。助けていただければ幸いです。Selenium in Python - ドロップダウンメニュー内のすべてのリンクを開く

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 

driver = webdriver.Firefox() 
driver.get("pioneerdoctor.com/productpage.cfm") 

cat = driver.find_elements_by_css_selector("a[href*='Product_home']") 

for i in cat: 
    i.click() 
    child = driver.find_elements_by_css_selector("li.active > a[href*='ProductPage']") 
    for m in child: 
     m.send_keys(Keys.CONTROL + 't') 

EDIT:

は、ここで私は、テキストファイルへの書き込み、ウェブブラウザを使用して起こってしまった現在の回避策です。私が見ている唯一の問題は、それが結果の重複を何度も書いていることです。後でコメントを見て、より良い方法で作業できるかどうかを見ていきます(これは確かです)。

from selenium import webdriver 
import webbrowser 

print("Opening Google Chrome..") 
driver = webdriver.Chrome() 
driver.get("http://pioneerdoctor.com/productpage.cfm") 
driver.implicitly_wait(.5) 
driver.maximize_window() 

cat = driver.find_elements_by_css_selector("a[href*='Product_home']") 

print("Writing URLS to file..") 
for i in cat: 
    i.click() 
    child = driver.find_elements_by_css_selector("a[href*='ProductPage']") 

    for i in child: 
     child = i.get_attribute("href") 
     file = open("Output.txt", "a") 
     file.write(str(child) + '\n') 
     file.close() 

driver.quit 
file = open("Output.txt", "r") 

Loop = input("Loop Number, Enter 0 to quit: ") 
Loop = int(Loop) 
x = 0 

if Loop == 0: 
    print("Quitting..") 
else: 
    for z in file: 
     if x == Loop: 
      break 
      print("Done.\n") 
     else: 
      webbrowser.open_new_tab(z) 
      x += 1 
+0

実際のURLは何ですか? – testerjoe2

+0

http://www.pioneerdoctor.com/productpage.cfm – TroyHP

+0

テストをいただきありがとうございます - 私は何かをする前にウィンドウを最大化して切り取った要素エラーを見つけることができませんでした。それに応じてコードを編集します。私はおそらく、txtファイルに "子"リストを書き、ドライバを終了して、新しいタブのwebbrowser.openのループを介してそれらの行を読むことについて考えていました。これが最善の方法であるかどうかは不明です。 - そうはない。リストがアクティブになり、その子孫の2番目のリンクにアクセスしようとしているので、明確にするために( "li.active> a [href * = 'ProductPage']")入力します。 – TroyHP

答えて

0

リンクのCSSセレクタが正しくないため、これらのカテゴリのリンクが見つかりませんでした。 li.active > a[href*='ProductPage']>を削除します。どうして ? p > qはpの直下の子を与えます。スペースまたは "p q"はpの中のすべての "q"を与えます。あなたが興味を持っているリンクは、liの直下の子ではありません。彼らは李の中にあるULの中にいます。

もう1つの問題は、新しいタブでリンクを開く方法です。代わりにこのコードを使用してください:

combo = Keys.chord(Keys.CONTROL, Keys.RETURN) 
m.sendKeys(combo) 

これはJavaでどのように行うのですか。私はPythonがKeys.chordを持っているべきだと思います。私があなただったら、別のブラウザインスタンスでリンクを開きます。タブとウィンドウの切り替えはセレン自体ではうまくサポートされていないことが分かりました。悪いことが起こる可能性があります。

タブを使用する前に、新しいタブを開いて前のタブに戻るという簡単な例を作成してください。前後に3〜4回行います。それはスムーズに動作しますか?良い。その後、3-5のタブでそれを行います。あなたの経験はどうでしたか教えてください。

+0

私は昨年CSSを勉強したので、私のセレクターは曇っていますが、あなたは正しいです。私はそれらを働かせます。 Keys.chordはまさに私が探しているものです。小さなテストは、物事について行くための素晴らしい方法です。できるだけ「完了」にするのは簡単ですが、テストするのはずっと困難です。 本当に素晴らしいアドバイスです。助けてくれてありがとうJoe!初めてスタックオーバーフローを起こしたことは素晴らしい経験でした。 – TroyHP

関連する問題