2016-10-20 7 views
0

最近私は個人的なプロジェクトでpythonとセレニウムのwebdriverを使って作業していますが、 :要素がページ文書に添付されていません "というエラーが発生しました。スクリプトが新しいページを読み込んだ後、" find_element "を使用して要素にアクセスしようとしました。この問題について多数の記事を読んでいますが、私の混乱した脳に光を当てました。古い要素の参照:新しいページを読み込んだ後に要素がページ文書に添付されていない[python] [selenium]

コードは次のとおりです。

from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support import expected_conditions as EC 
from selenium.webdriver.common.action_chains import ActionChains 
from bs4 import BeautifulSoup 

#Ask User for keyword 
keyword = input("Insert Product Name:") 
#Open chrome browser 
driver = webdriver.Chrome(executable_path=r"C:\chromedriver.exe") 
#Open e-bay.com 
driver.get("http://www.e-bay.com") 
#Find the search text field element 
search_element = driver.find_element_by_id("gh-ac") 
#Clear the search text field of any data 
search_element.clear() 
#Type the user given keyword to the text field 
search_element.send_keys(keyword) 
#Hit enter key 
search_element.send_keys(Keys.RETURN) 
#Set number of listings on the same page (25,50,100,200) 
#Find the dropdown menu element for listings per page(Wait till it shows up) 
dropdown_menu_lpp = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#cbBtmElem > div > ul.sel > li > a.btn.btn-s.small.btn-ter.dropdown-toggle"))) 
#Mouse over the dropdown menu 
actions = ActionChains(driver) 
actions.move_to_element(dropdown_menu_lpp) 
actions.perform() 
#Find the desired setting and click it.I choose 200 listings per page here because is the most convennient for this application. 
listings_per_page = WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "#cbBtmElem > div > ul.lyr.txtRt.dropdown-menu.dropdown-menu-sm.menu3 > li:nth-child(3)"))) 
actions.move_to_element(listings_per_page) 
actions.click() 
actions.perform() 
#Find Listings link(Wait til the links show up first) 
listings_links = [] 
listing_link_elements = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.CLASS_NAME,"vip"))) 
#Put the links in a list data-structure 
for link in listing_link_elements: 
      listings_links.append(link.get_attribute('href')) 
print(listings_links)  
driver.quit() 

スクリプトは、e-bay.comを開き、キーワードを検索、リストの数が200に示した変更、(200)リストのリンクを得ることになっていますそれらをリストデータ構造上に置く。

ありがとうございます。

PS:ImはPython 3.5を使用しています。

答えて

0

なぜ古い要素の問題があるのか​​わかりません。私はPythonを持っていませんが、私はJavaで以下のコードを書いて、うまくいきます。あなたは私がすべての待ち時間を取り除いたことに気付くでしょう...あなたはそれらを必要とするかもしれませんが、それは206個(200個の定期的な+ 6個のスポンサー付き)のリンクを正常に印刷しました。

driver.get("http://www.ebay.com/sch/i.html?_ipg=200&_nkw=" + keyword.replace(" ", "+")); 
List<WebElement> products = driver.findElements(By.cssSelector("a.vip")); 
System.out.println(products.size()); 
List<String> links = new ArrayList<String>(); 
for (WebElement product : products) 
{ 
    links.add(product.getAttribute("href")); 
} 
System.out.println(links); 

私は少し違ったアプローチを取っていました。私は、あなたが望むページあたり200を表示するようにURLを編集でき、URLに直接検索キーワードを挿入することもできることがわかりました。それは時間とコードを節約し、ユーザーのシナリオを実行しようとしていない限り(私はそうではないと推測しています)、このショートカットを利用できます。

これをPythonに変換するには、以下のコードを使用します。注:私はPythonに堪能ではないので、このコードは最適化されていない可能性があり、テストする方法はありません。

... 
driver.get("http://www.ebay.com/sch/i.html?_ipg=200&_nkw=" + keyword.replace(' ', '+')) 
products = driver.find_elements_by_css_selector("a.vip") 
links = [] 
for product in products: 
    links.append(product.get_attribute('href')) 
print(links) 
driver.quit() 
+0

まずはお返事ありがとうございます。私は上記の解決策を認識していますが、ユーザーシナリオを実行しようとしていました。なぜこのエラーを具体的に求めているのですか。 –

関連する問題