使用Python,Selenium和ActionChains从下拉列表中选择选项后无法找到元素

时间:2016-11-11 20:12:45

标签: python html selenium nosuchelementexception

对于某人来说,这将是一个简单的问题,并且我认为这是一个简单问题的长篇文章。

我正在抓取供应商的网站并写入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()

然后我添加代码以选择按钮点击代码前面的“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抽出时间回答。

1 个答案:

答案 0 :(得分:0)

我建议使用xpath以下,因为它没有索引麻烦,假设所有tr只有一个按钮

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