对于某人来说,这将是一个简单的问题,并且我认为这是一个简单问题的长篇文章。
我正在抓取供应商的网站并写入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()
然后我添加代码以选择按钮点击代码前面的“In-Stock”选项:
#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解决方案无效。在伪编码 - babble中,我认为该程序专注于下拉表,无法看到其余的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 :(得分:0)
我建议使用xpath以下,因为它没有索引麻烦,假设所有tr
只有一个按钮
searchButton = driver.find_element_by_xpath('//*[@id="adv_search_box"]//button[@title="Search"]//span[@class="button-left"])