我一直试图使用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>
答案 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}