2016-11-11 78 views
1

這將是一個容易爲別人一個下拉列表中選擇一個選項後找到的元素,變成了很長的帖子什麼,我認爲這是一個簡單的問題。無法從使用Python,硒和ActionChains

我刮供應商的網站,並寫入到CSV,這樣我就不必通過頁面和產品頁面手動苦幹。爲了獲得產品列表,我運行了一個沒有變量的搜索並獲得了很多。但是,如果我嘗試使用下拉選項將我的搜索限制在庫存產品中,我的代碼就會出現問題。

由於這是一個第三方網站,我不能改變的HTML。下面是從該網站的HTML片斷(因爲它重新格式化抄非常難看):

<tbody id="adv_search_box"> 
    <tr> 
     <td class="data-name">Search in category:</td> 
     <td class="data-input" colspan="2"> 
     <select name="posted_data[categoryid]" class="adv-search-select"> 
      <option value="">&nbsp;</option> 
      <option value="257">Hot New Arrivals</option> 
      <option value="252">In-Stock</option> 

...

 <button class="button main-button" type="submit" title="Search"> 
      <span class="button-right"><span class="button-left">Search</span></span> 
     </button> 
     </td> 
    </tr> 
</tbody> 

當我使用下面點擊搜索按鈕,我得到的一切供應商不考慮地位。因此,這只是正常:

searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]/tr[8]/td[2]/button/span/span') 
actions = ActionChains(driver) 
actions.move_to_element(searchButton) 
actions.click(searchButton) 
actions.perform() 

然後我添加代碼以選擇按鈕,單擊代碼前的「存貨」選項:

#Select in-stock on search page 
InStockSelection = driver.find_element_by_xpath('//*[@id="adv_search_box"]/tr[1]/td[2]/select/option[3]') 
actions = ActionChains(driver) 
actions.move_to_element(InStockSelection) 
actions.click(InStockSelection) 
actions.perform() 

#Click button 
searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]/tr[8]/td[2]/button/span/span') 
actions = ActionChains(driver) 
actions.move_to_element(searchButton) 
actions.click(searchButton) 
actions.perform() 

我收到以下錯誤:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="adv_search_box"]/tr[8]/td[2]/button/span/span"} 

最後一個音符。我意識到這可以以更簡潔,更緊湊和更優雅的方式進行編碼。它是這樣編碼的,因爲我不會再看它,直到它破裂(即供應商改變他們的網站),並且如果它被編碼像我六歲那樣,我就能弄清楚我是什麼從現在開始做了幾年。

謝謝大家的幫助。

編輯1:在我看來,簡單的xpath解決方案將無法正常工作。在僞編碼喋喋不休,我認爲該程序專注於下拉表,並不能看到其餘的HTML。如果我可以重新將注意力集中在整個頁面上,它應該可以工作。

解決方案:編程是我喜歡的魔術。這通常是你沒有看的,這是你需要注意的一點。在這種情況下,選擇按鈕的代碼沒有任何問題。問題在於用於選擇下拉選項的代碼無法正常工作,並且最後的點擊更改了頁面焦點。

的解決方案是更改的選項位於避免操作鏈的方式。

driver.find_element_by_xpath("//select[@name='posted_data[categoryid]']/option[text()='In-Stock']").click() 

在此文章中找到的幫助:Selenium - Python - drop-down menu option value

謝謝MikeJRamsey56,爲說服我拋棄的行動鏈,並感謝您dejavu_cmd_delt抽出時間來回答。

回答

0

我會建議使用下面的XPath,因爲它是免費的索引麻煩的,假設只有一個在所有tr

searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]//button[@title="Search"]//span[@class="button-left"]) 
+0

都能跟得上按鈕,沒有工作。即使當我在缺失的結尾單引號中加入時也是如此。 ;-) – NickV