這將是一個容易爲別人一個下拉列表中選擇一個選項後找到的元素,變成了很長的帖子什麼,我認爲這是一個簡單的問題。無法從使用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=""> </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抽出時間來回答。
都能跟得上按鈕,沒有工作。即使當我在缺失的結尾單引號中加入時也是如此。 ;-) – NickV