[英]Select 2nd <li> element in a picklist Selenium
I'm having a doozy running into different errors.我遇到了不同的错误。 The goal is set a picklist option so that a report page with various stats updates.目标是设置一个选项列表选项,以便更新具有各种统计信息的报告页面。 The picklist is to choose months and years and whenever I want this report it's for the previous month so the option i always want is the previous months which ends up being li#2.选择列表是选择月份和年份,每当我想要这份报告时,它都是上个月的,所以我总是想要的选项是前几个月,最终是 li#2。
So I have the following所以我有以下
ReportPeriodInput = DriverTransactionSummary.find_element_by_xpath('//*[@id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_DropDown"]/div/ul/li[2]')
If i do something like如果我做类似的事情
ReportPeriodInput.click()
I get the following error我收到以下错误
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
If I alter how I do it and add get_attribute('innerHTML)如果我改变我的做法并添加 get_attribute('innerHTML)
ReportPeriodInput = DriverTransactionSummary.find_element_by_xpath('//*[@id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_DropDown"]/div/ul/li[2]').get_attribute('innerHTML')
ReportPeriodInput.click()
I get the following error我收到以下错误
AttributeError: 'str' object has no attribute 'click' AttributeError: 'str' 对象没有属性 'click'
What is the correct way to select this element and have it be the new value in the picklist?选择此元素并将其作为选项列表中的新值的正确方法是什么? See below for the HTML page details请参阅下面的 HTML 页面详细信息
<div id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod" class="RadComboBox RadComboBox_Windows7 RadComboBoxWithLabel" style="white-space:normal;">
<label for="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_Input" class="rcbLabel">Period:</label>
<table summary="combobox" border="0" style="border-width:0;border-collapse:collapse;width:250px">
<tr class="rcbReadOnly">
<td class="rcbInputCell rcbInputCellLeft" style="width:100%;"><input name="dnn$ctr1001$VolumeByMonthCS$rcbPeriod" type="text" class="rcbInput radPreventDecorate" id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_Input" value="(12)December - 2017" readonly="readonly" /></td>
<td class="rcbArrowCell rcbArrowCellRight"><a id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_Arrow" style="overflow: hidden;display: block;position: relative;outline: none;">select</a></td>
</tr>
</table>
<div class="rcbSlide" style="z-index:6000;display:none;">
<div id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_DropDown" class="RadComboBoxDropDown RadComboBoxDropDown_Windows7 ">
<div class="rcbScroll rcbWidth">
<ul class="rcbList">
<li class="rcbItem">(12)December - 2017</li>
<li class="rcbItem">(11)November - 2017</li>
<li class="rcbItem">(10)October - 2017</li>
<li class="rcbItem">(09)September - 2017</li>
<li class="rcbItem">(08)August - 2017</li>
<li class="rcbItem">(07)July - 2017</li>
<li class="rcbItem">(06)June - 2017</li>
<li class="rcbItem">(05)May - 2017</li>
<li class="rcbItem">(04)April - 2017</li>
<li class="rcbItem">(03)March - 2017</li>
<li class="rcbItem">(02)February - 2017</li>
<li class="rcbItem">(01)January - 2017</li>
<li class="rcbItem">(12)December - 2016</li>
<li class="rcbItem">(11)November - 2016</li>
<li class="rcbItem">(10)October - 2016</li>
<li class="rcbItem">(09)September - 2016</li>
<li class="rcbItem">(08)August - 2016</li>
<li class="rcbItem">(07)July - 2016</li>
<li class="rcbItem">(06)June - 2016</li>
<li class="rcbItem">(05)May - 2016</li>
<li class="rcbItem">(04)April - 2016</li>
<li class="rcbItem">(03)March - 2016</li>
<li class="rcbItem">(02)February - 2016</li>
<li class="rcbItem">(01)January - 2016</li>
<li class="rcbItem">(12)December - 2015</li>
<li class="rcbItem">(11)November - 2015</li>
<li class="rcbItem">(10)October - 2015</li>
<li class="rcbItem">(09)September - 2015</li>
<li class="rcbItem">(08)August - 2015</li>
<li class="rcbItem">(07)July - 2015</li>
<li class="rcbItem">(06)June - 2015</li>
<li class="rcbItem">(05)May - 2015</li>
<li class="rcbItem">(04)April - 2015</li>
<li class="rcbItem">(03)March - 2015</li>
<li class="rcbItem">(02)February - 2015</li>
<li class="rcbItem">(01)January - 2015</li>
<li class="rcbItem">(12)December - 2014</li>
<li class="rcbItem">(11)November - 2014</li>
<li class="rcbItem">(10)October - 2014</li>
<li class="rcbItem">(09)September - 2014</li>
<li class="rcbItem">(08)August - 2014</li>
<li class="rcbItem">(07)July - 2014</li>
<li class="rcbItem">(06)June - 2014</li>
<li class="rcbItem">(05)May - 2014</li>
<li class="rcbItem">(04)April - 2014</li>
<li class="rcbItem">(03)March - 2014</li>
<li class="rcbItem">(02)February - 2014</li>
<li class="rcbItem">(01)January - 2014</li>
<li class="rcbItem">(12)December - 2013</li>
<li class="rcbItem">(11)November - 2013</li>
<li class="rcbItem">(10)October - 2013</li>
<li class="rcbItem">(09)September - 2013</li>
<li class="rcbItem">(08)August - 2013</li>
<li class="rcbItem">(07)July - 2013</li>
<li class="rcbItem">(06)June - 2013</li>
<li class="rcbItem">(05)May - 2013</li>
<li class="rcbItem">(04)April - 2013</li>
<li class="rcbItem">(03)March - 2013</li>
<li class="rcbItem">(02)February - 2013</li>
<li class="rcbItem">(01)January - 2013</li>
<li class="rcbItem">(12)December - 2012</li>
<li class="rcbItem">(11)November - 2012</li>
<li class="rcbItem">(10)October - 2012</li>
<li class="rcbItem">(09)September - 2012</li>
<li class="rcbItem">(08)August - 2012</li>
<li class="rcbItem">(07)July - 2012</li>
<li class="rcbItem">(06)June - 2012</li>
<li class="rcbItem">(05)May - 2012</li>
<li class="rcbItem">(04)April - 2012</li>
<li class="rcbItem">(03)March - 2012</li>
<li class="rcbItem">(02)February - 2012</li>
<li class="rcbItem">(01)January - 2012</li>
<li class="rcbItem">(12)December - 2011</li>
<li class="rcbItem">(11)November - 2011</li>
<li class="rcbItem">(10)October - 2011</li>
<li class="rcbItem">(09)September - 2011</li>
<li class="rcbItem">(08)August - 2011</li>
<li class="rcbItem">(07)July - 2011</li>
<li class="rcbItem">(06)June - 2011</li>
<li class="rcbItem">(05)May - 2011</li>
<li class="rcbItem">(04)April - 2011</li>
<li class="rcbItem">(03)March - 2011</li>
<li class="rcbItem">(02)February - 2011</li>
<li class="rcbItem">(01)January - 2011</li>
<li class="rcbItem">(12)December - 2010</li>
<li class="rcbItem">(11)November - 2010</li>
<li class="rcbItem">(10)October - 2010</li>
<li class="rcbItem">(09)September - 2010</li>
<li class="rcbItem">(08)August - 2010</li>
<li class="rcbItem">(07)July - 2010</li>
<li class="rcbItem">(06)June - 2010</li>
<li class="rcbItem">(05)May - 2010</li>
<li class="rcbItem">(04)April - 2010</li>
<li class="rcbItem">(03)March - 2010</li>
<li class="rcbItem">(02)February - 2010</li>
<li class="rcbItem">(01)January - 2010</li>
<li class="rcbItem">(12)December - 2009</li>
<li class="rcbItem">(11)November - 2009</li>
<li class="rcbItem">(10)October - 2009</li>
<li class="rcbItem">(09)September - 2009</li>
<li class="rcbItem">(08)August - 2009</li>
<li class="rcbItem">(07)July - 2009</li>
<li class="rcbItem">(06)June - 2009</li>
<li class="rcbItem">(05)May - 2009</li>
<li class="rcbItem">(04)April - 2009</li>
<li class="rcbItem">(03)March - 2009</li>
<li class="rcbItem">(02)February - 2009</li>
<li class="rcbItem">(01)January - 2009</li>
<li class="rcbItem">(12)December - 2008</li>
<li class="rcbItem">(11)November - 2008</li>
<li class="rcbItem">(10)October - 2008</li>
<li class="rcbItem">(09)September - 2008</li>
<li class="rcbItem">(08)August - 2008</li>
<li class="rcbItem">(07)July - 2008</li>
<li class="rcbItem">(06)June - 2008</li>
<li class="rcbItem">(05)May - 2008</li>
<li class="rcbItem">(04)April - 2008</li>
<li class="rcbItem">(03)March - 2008</li>
<li class="rcbItem">(02)February - 2008</li>
<li class="rcbItem">(01)January - 2008</li>
<li class="rcbItem">(12)December - 2007</li>
<li class="rcbItem">(11)November - 2007</li>
<li class="rcbItem">(10)October - 2007</li>
<li class="rcbItem">(09)September - 2007</li>
<li class="rcbItem">(08)August - 2007</li>
<li class="rcbItem">(07)July - 2007</li>
<li class="rcbItem">(06)June - 2007</li>
<li class="rcbItem">(05)May - 2007</li>
<li class="rcbItem">(04)April - 2007</li>
<li class="rcbItem">(03)March - 2007</li>
<li class="rcbItem">(02)February - 2007</li>
<li class="rcbItem">(01)January - 2007</li>
<li class="rcbItem">(12)December - 2006</li>
<li class="rcbItem">(11)November - 2006</li>
<li class="rcbItem">(10)October - 2006</li>
<li class="rcbItem">(09)September - 2006</li>
<li class="rcbItem">(08)August - 2006</li>
<li class="rcbItem">(07)July - 2006</li>
<li class="rcbItem">(06)June - 2006</li>
<li class="rcbItem">(05)May - 2006</li>
<li class="rcbItem">(04)April - 2006</li>
<li class="rcbItem">(03)March - 2006</li>
<li class="rcbItem">(02)February - 2006</li>
<li class="rcbItem">(01)January - 2006</li>
<li class="rcbItem">(12)December - 2005</li>
<li class="rcbItem">(11)November - 2005</li>
<li class="rcbItem">(10)October - 2005</li>
<li class="rcbItem">(09)September - 2005</li>
<li class="rcbItem">(08)August - 2005</li>
<li class="rcbItem">(07)July - 2005</li>
<li class="rcbItem">(06)June - 2005</li>
<li class="rcbItem">(05)May - 2005</li>
<li class="rcbItem">(04)April - 2005</li>
<li class="rcbItem">(03)March - 2005</li>
<li class="rcbItem">(02)February - 2005</li>
<li class="rcbItem">(01)January - 2005</li>
<li class="rcbItem">(12)December - 2004</li>
<li class="rcbItem">(11)November - 2004</li>
<li class="rcbItem">(10)October - 2004</li>
<li class="rcbItem">(09)September - 2004</li>
<li class="rcbItem">(08)August - 2004</li>
<li class="rcbItem">(07)July - 2004</li>
<li class="rcbItem">(06)June - 2004</li>
<li class="rcbItem">(05)May - 2004</li>
<li class="rcbItem">(04)April - 2004</li>
<li class="rcbItem">(03)March - 2004</li>
<li class="rcbItem">(02)February - 2004</li>
<li class="rcbItem">(01)January - 2004</li>
</ul>
</div>
</div>
</div>
<input id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_ClientState" name="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_ClientState" type="hidden" />
And an image of what that looks like:以及看起来像什么的图像:
I'm not too familiar with python but knowing how it works in other languages you should be able to just get a list of elements using .find_elements_by_css_selector()
and then clicking on the second element in the list.我对 python 不太熟悉,但知道它在其他语言中的工作原理,您应该能够使用.find_elements_by_css_selector()
获取元素列表,然后单击列表中的第二个元素。
options = DriverTransactionSummary.find_elements_by_css_selector(".rcbItem")
options[1].click();
Of course, you would need to click on the dropdown menu first in order to click on the second li
element in the menu.当然,您需要先单击下拉菜单才能单击菜单中的第二个li
元素。 Hope this helps.希望这可以帮助。
Based on others help the easiest (may not be the best) way to do it was to make sure to click on the picklist field itself, then I was able to have it find element[2].基于其他人的帮助,最简单的(可能不是最好的)方法是确保单击选项列表字段本身,然后我就可以让它找到元素 [2]。
ReportPeriodClick = DriverTransactionSummary.find_element_by_xpath('//*[@id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_Input"]').click()
ReportPeriodClick2 = DriverTransactionSummary.find_element_by_xpath('//*[@id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_DropDown"]/div/ul/li[2]').click()
Let us analyze first what happened with your code trials.让我们首先分析您的代码试验发生了什么。
You have identified an WebElement
and tried to invoke click()
as follows :您已经确定了一个WebElement
并尝试调用click()
如下:
ReportPeriodInput = DriverTransactionSummary.find_element_by_xpath('//*[@id="dnn_ctr1001_VolumeByMonthCS_rcbPeriod_DropDown"]/div/ul/li[2]') ReportPeriodInput.click()
But this <li>
is an look alike of option
within the DropDown
.但是这个<li>
看起来很像DropDown
的option
。 Hence you see :因此你会看到:
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
Next you have extracted the innerHTML
of the above WebElement
which returns a String
and tried to invoke click()
on it.接下来,您提取了上述WebElement
的innerHTML
,它返回一个String
并尝试在其上调用click()
。 click()
method is defined for WebElement
. click()
方法是为WebElement
定义的。 As String
Class objects have no click()
method associated you see the error :由于String
Class 对象没有关联的click()
方法,您会看到错误:
AttributeError: 'str' object has no attribute 'click'
To click on the DropDown
and select the option (11)November - 2017
you have to :要单击DropDown
并选择选项(11)November - 2017
您必须:
Identify the Dropdown
WebElement
and click on it as follows :确定Dropdown
WebElement
并按如下方式单击它:
ReportPeriodInput = DriverTransactionSummary.find_element_by_xpath("//div[@class='RadComboBoxDropDown RadComboBoxDropDown_Windows7' and contains(@id,'VolumeByMonthCS_rcbPeriod_DropDown')]") ReportPeriodInput.click()
Next you need to click the intended option
from the Dropdown
as follows :接下来,您需要从Dropdown
单击预期的option
,如下所示:
ReportPeriodInputOption = DriverTransactionSummary.find_element_by_xpath("//div[@class='RadComboBoxDropDown RadComboBoxDropDown_Windows7' and contains(@id,'VolumeByMonthCS_rcbPeriod_DropDown')]/div/ul/li[@class='rcbItem' and contains(.,'November - 2017')]") ReportPeriodInputOption.click()
As I can see that you have given class to each li , the best way to select the second li or say a particular child is using css_selector method.正如我所看到的,您已经为每个li提供了类,选择第二个li或说特定孩子的最佳方法是使用css_selector方法。
driver.find_element_by_css_selector("ul .rcbItem:nth-child(2)").click()
The above code will select (11)November - 2017
以上代码将选择(11)November - 2017
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.