【问题标题】:Unable to find an element after selecting an option from a dropdown using Python, Selenium, and ActionChains使用 Python、Selenium 和 ActionChains 从下拉列表中选择选项后无法找到元素
【发布时间】:2017-03-26 03:05:29
【问题描述】:

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

我正在抓取供应商的网站并写入 csv,这样我就不必手动浏览产品的页面和页面。为了获得产品列表,我在没有变量的情况下进行了搜索并得到了很多。但是,如果我尝试使用下拉选项将搜索限制在库存产品中,我的代码就会出错。

由于这是第 3 方网站,我无法更改 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 解决方案行不通。在pseudo-coding-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 抽出时间来回答。

【问题讨论】:

    标签: python html selenium nosuchelementexception


    【解决方案1】:

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

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

    【讨论】:

    • 不,没用。即使我添加了缺少的单引号。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2020-12-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-15
    • 1970-01-01
    相关资源
    最近更新 更多