这将是一个容易为别人一个下拉列表中选择一个选项后找到的元素,变成了很长的帖子什么,我认为这是一个简单的问题。无法从使用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