硒“选择”类返回“不支持的定位器策略”错误

时间:2019-11-11 13:04:02

标签: python selenium drop-down-menu

我一直试图使用Python和Selenium Package进入一个网站。在此网站中,我必须:(1)输入一些登录凭据(2)转到特定页面(需要凭据才能到达该页面) (3)从下拉列表中选择值

我已经完成了前两个步骤,但是我无法克服下拉列表问题。我总是会收到错误:

Message: invalid argument: Unsupported locator strategy: null

我试图将Locator方法从“名称”更改为“ id”,再更改为“值”,但未成功。

任何帮助将不胜感激,我对为什么其余所有方法都有效而这一点失败感到困惑。由于专有问题,我无法提供原始网站作为示例。

谢谢!

编辑:我已经添加了有关下拉列表的HTML代码,由于个人详细信息而不得不省略一些信息,但是我认为无论如何应该有所帮助。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support.ui import Select

#log-in info
userStr = "User"
passStr = 'Pass'

#enter log-in
browser = webdriver.Chrome()
browser.get(('https://www.example.com'))

Log_User = browser.find_element_by_id('user_field')
Log_User.send_keys(userStr)

Log_User = browser.find_element_by_id('pass_field')
Log_User.send_keys(passStr)

Enter_Button = browser.find_element_by_id('enter_button')
Enter_Button.click()

#go to desired window
browser.get(('https://www.example.com/newpage.aspx'))

#select dropdown (the issue is here)
select = Select(browser.find_element_by_name('drop-down-list'))
select.select_by_value("target")
<div class="ms-webpart-zone ms-fullWidth">
    <div id="MSOZoneCell_WebPartWPQ2" class="s4-wpcell-plain ms-webpartzone-cell ms-webpart-cell-vertical ms-fullWidth ">
        <div class="ms-webpart-chrome ms-webpart-chrome-vertical ms-webpart-chrome-fullWidth ">
            <div webpartid="46ca13d8-6d03-474f-bc6c-d2c6cf8c95f2" haspers="false" id="WebPartWPQ2" width="100%" class="ms-WPBody noindex " allowdelete="false" style=""><div class="ms-rtestate-field"><h2 class="3s-web-title">***<br></h2></div><div class="ms-clear"></div></div>
        </div><div class="ms-PartSpacingVertical"></div>
    </div><div id="MSOZoneCell_WebPartctl00_ctl51_g_0c672ab8_73ff_4b46_a925_3f0c0213b64d" class="s4-wpcell-plain ms-webpartzone-cell ms-webpart-cell-vertical ms-fullWidth ">
        <div class="ms-webpart-chrome ms-webpart-chrome-vertical ms-webpart-chrome-fullWidth ">
            <div webpartid="0c672ab8-73ff-4b46-a925-3f0c0213b64d" haspers="false" id="WebPartctl00_ctl51_g_0c672ab8_73ff_4b46_a925_3f0c0213b64d" width="100%" class="ms-WPBody noindex " allowdelete="false" style=""><div style="display: table; margin-bottom: 10px;"><div style="display: table-row;"><div style="display: table-cell; vertical-align: middle; text-align: left;"><label style="margin-bottom: 0px;" for="ctl00_ctl51_g_0c672ab8_73ff_4b46_a925_3f0c0213b64d_ddlDealers">Concessionário:</label></div><div style="display: table-cell; vertical-align: middle; text-align: left; padding-left: 15px;">
            <select name="ctl00$ctl51$g_0c672ab8_73ff_4b46_a925_3f0c0213b64d$ddlDealers" onchange="javascript:setTimeout('__doPostBack(\'ctl00$ctl51$g_0c672ab8_73ff_4b46_a925_3f0c0213b64d$ddlDealers\',\'\')', 0)" id="ctl00_ctl51_g_0c672ab8_73ff_4b46_a925_3f0c0213b64d_ddlDealers">
                <option selected="selected" value="-1;-1">-- Concessionário --</option>
                <option value="*****;****">***** (Special Sales) (****2)</option>
        ...
        </select></div></div></div>
            <span>Necessita de seleccionar um concessionário.</span><div class="ms-clear"></div></div>
        </div>
    </div>
</div>

2 个答案:

答案 0 :(得分:0)

错误消息似乎是抱怨将空参数传递给Select的构造函数。我的猜测是browser.find_element_by_name('drop-down-list')没有返回任何东西,这可能会将值设置为null,这就是错误消息可能正在详述的内容。

根据您提供的HTML,看起来select元素的定位符不正确-您正在搜索by_name,但是元素没有明显的{{1 }}属性-它只是一个随机生成的字符串。

我在浏览器中测试了您的代码,当name找不到元素时,我收到了NoSuchElementException,因此我不确定browser.find_element_by_name('drop-down-list')的错误来源。 null仅使用一个select_by_value参数,所以我也不认为问题不在那。

您可以尝试更改为XPath,看看是否可行:

string

由于您提到页面上只有一个select = Select(browser.find_element_by_xpath("//select[contains(@id, 'ddlDealers')]")) 元素,因此您也可以尝试:

select

如果成功找到一个元素,则会在控制台中显示类似# locate select element select_element = browser.find_element_by_xpath("//select") # call print to verify something has been located print(select_element) # declare the select object select = Select(select_element) 之类的信息-这将排除选择器是否有问题。

如果这不起作用,则可能是某种<selenium.webdriver.remote.webelement.WebElement (session="5c7855ef72bf6bca9babb1e0a7a22ac2", element="6e100df3-342d-47ad-99f3-f48300282b5b")>元素正在向驱动程序隐藏iframe -如果上面的代码抛出了select,我们可能需要在页面上查看更多HTML即可获取NoSuchElementException出现的上下文。

答案 1 :(得分:0)

find_element_by_name是真的吗?您可以这样做:

Player {name} has a score of {score}