编辑:关于这个page https://i.stack.imgur.com/mdjih.png,我正在尝试提交从数据库生成的报告的参数。我已经能够为 send_keys() 发送第一个字段的新开始日期。第二个字段(结束日期)保持不变。对于第三个字段及之后的字段(除第一个字段外),我需要单击(Select All)
.
我需要点击(Select All)
,仅在单击父级“divDropDown”后才显示在隐藏的下拉表中。激活后,此隐藏表会显示一个 tbody,其中 5-6 个 tr/td/span 集保存各种选项。您可以在 id 下找到全选选项ctl31_ctl04_ctl07_divDropDown_ctl00
.
在 HTML 的更上方,有一个 dropDownButton ,它不会在代码中生成错误(前 2 行),但也不会像手动那样在浏览器上显示为激活该下拉菜单,所以我认为它没有帮助这里。
我搜索了相关答案,并尝试了 Selenium 中的各种代码(等待、execute_script 等)来访问此项目,甚至尝试切换到其上方的 iframe(似乎在单击输入区域时激活,尽管寻找的元素在它之外),但仍然出现错误“无法找到元素...”
以下是尝试过的各种代码:
driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07"]')#.click()
driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_ddDropDownButton"]').click()
#driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_divDropDown"]').click()
#driver.execute_script("event.cancelBubble=true;")
#driver.execute_script("arguments[0].click();", elem)
#driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_divDropDown_HiddenIndices" and @type="hidden"]')
#elem1 = driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_divDropDown_ctl00" and @type="checkbox"]')#.click()
elem1 = driver.find_element_by_xpath('//*div[@id="ctl31_ctl04_ctl07_divDropDown"]/.//span[@id="ctl31_ctl04_ctl07_divDropDown_ctl00"]').get_attribute("innerHTML")
driver.execute_script("arguments[0].click();", elem1)
selector = '#ctl31_ctl04_ctl07_divDropDown_ctl00'
selector = '#ctl31_ctl04_ctl07_divDropDown > span > div:nth-child(1) > table > tbody > tr:nth-child(1) > td > span > label'
path = '//*[@id="ctl31_ctl04_ctl07_divDropDown"]/span/div[1]/table/tbody/tr[1]/td/span/input'#label'
#path = '//*[@id="ctl31_ctl04_ctl07_divDropDown_ctl00"]'
#driver.find_element_by_css_selector(selector).click()
driver.find_element_by_xpath(path).click()
我相信它无法找到元素,因为它通常是隐藏的,但无论我如何尝试单击或执行下拉菜单,通过按钮或单击 div,它都不会保持打开状态(我有时会看到它闪烁,它只是重新关闭,因此表格及其下拉列表再次隐藏)。我还尝试了以下代码来测试它。使用常规等待命令,经过一些迭代后我会收到“陈旧元素”错误。没有任何等待,我就会得到 element not find 。通过“等到”,我可以看到下拉列表向上/向下移动,但当它可见时似乎无法捕获“全选”?所有这一切都是用我的打印语句打开/关闭下拉列表以查看何时(在打印“检查是否存在”之后)。我也尝试过直接执行“全选脚本”"$get('ctl31_ctl04_ctl07').control.OnSelectAllClick(this);"
无济于事。
def check_exists_by_xpath(xpath):
try:
driver.find_element_by_xpath(xpath)
except NoSuchElementException:
return False
return True
for i in range(15):
#driver.implicitly_wait(1000)
#driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_ddDropDownButton"]').click()
wait(driver, 1000).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="ctl31_ctl04_ctl07_ddDropDownButton"]'))).click()
#elem = driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_divDropDown_ctl00"]')
print('checking if exists')
if check_exists_by_xpath('//*[@id="ctl31_ctl04_ctl07_divDropDown_ctl00"]'):
driver.find_element_by_xpath('//*[@id="ctl31_ctl04_ctl07_divDropDown_ctl00"]').click()
print('did it!')
else: print('past dropdown button %d' % i)
i +=1
这是 HTML(这是一个登录网站,所以我不能显示太多其他内容,抱歉图片:html https://i.stack.imgur.com/FDuAs.png
<iframe id="ctl31_ctl04_ctl07_ctl01" onclick="event.cancelBubble=true;" onactivate="event.cancelBubble=true;" style="display:none;position:absolute;z-index:10;" src="javascript:'';" frameBorder="0" title="Borough: place holder" longdesc="Borough: place holder" Name="ctl31_ctl04_ctl07_ctl01"></iframe>
<div id="ctl31_ctl04_ctl07_divDropDown" onclick="event.cancelBubble=true;" onactivate="event.cancelBubble=true;" style="display:inline-block;border-color:DarkGray;border-width:1px;border-style:Solid;overflow:auto;background-color:window;display:none;position:absolute;z-index:11;">
<span style="margin: 0px; background-color: window;"><div style="overflow: auto; width: 186px; height: 133px;">
<table cellpadding="0" cellspacing="0" style="background-color:window;">
<tbody>
<tr>
<td nowrap="nowrap">
<span>
<input id="ctl31_ctl04_ctl07_divDropDown_ctl00" type="checkbox" name="ctl31$ctl04$ctl07$divDropDown$ctl00" onclick="$get('ctl31_ctl04_ctl07').control.OnSelectAllClick(this);"><label for="ctl31_ctl04_ctl07_divDropDown_ctl00">(Select All)</label>
</span></td></tr>
<tr>
<td nowrap="nowrap"><span><input id="ctl31_ctl04_ctl07_divDropDown_ctl01" type="checkbox" name="ctl31$ctl04$ctl07$divDropDown$ctl01" onclick="$get('ctl31_ctl04_ctl07').control.OnValidValueClick(this, 'ctl31_ctl04_ctl07_divDropDown_ctl00');"><label for="ctl31_ctl04_ctl07_divDropDown_ctl01">MANHATTAN </label></span></td></tr>
<tr>
<td nowrap="nowrap"><span><input id="ctl31_ctl04_ctl07_divDropDown_ctl02" type="checkbox" name="ctl31$ctl04$ctl07$divDropDown$ctl02" onclick="$get('ctl31_ctl04_ctl07').control.OnValidValueClick(this, 'ctl31_ctl04_ctl07_divDropDown_ctl00');"><label for="ctl31_ctl04_ctl07_divDropDown_ctl02">BROOKLYN </label></span></td></tr>
<tr>
<td nowrap="nowrap"><span><input id="ctl31_ctl04_ctl07_divDropDown_ctl03" type="checkbox" name="ctl31$ctl04$ctl07$divDropDown$ctl03" onclick="$get('ctl31_ctl04_ctl07').control.OnValidValueClick(this, 'ctl31_ctl04_ctl07_divDropDown_ctl00');"><label for="ctl31_ctl04_ctl07_divDropDown_ctl03">QUEENS </label></span></td></tr>
<tr>
<td nowrap="nowrap"><span><input id="ctl31_ctl04_ctl07_divDropDown_ctl04" type="checkbox" name="ctl31$ctl04$ctl07$divDropDown$ctl04" onclick="$get('ctl31_ctl04_ctl07').control.OnValidValueClick(this, 'ctl31_ctl04_ctl07_divDropDown_ctl00');"><label for="ctl31_ctl04_ctl07_divDropDown_ctl04">BRONX </label></span></td></tr>
<tr>
<td nowrap="nowrap"><span><input id="ctl31_ctl04_ctl07_divDropDown_ctl05" type="checkbox" name="ctl31$ctl04$ctl07$divDropDown$ctl05" onclick="$get('ctl31_ctl04_ctl07').control.OnValidValueClick(this, 'ctl31_ctl04_ctl07_divDropDown_ctl00');"><label for="ctl31_ctl04_ctl07_divDropDown_ctl05">STATEN ISLAND </label></span></td></tr>
</tbody>
</table>
<input type="hidden" name="ctl31$ctl04$ctl07$divDropDown$HiddenIndices" id="ctl31_ctl04_ctl07_divDropDown_HiddenIndices" value="">
</div>
<div style="height: 16px; width: 100%; margin: 0px; border-top: 1px solid lightgray; background-color: window; direction: ltr;"></div>
</span>
</div>
网页如下所示:page https://i.stack.imgur.com/mdjih.png
有任何想法吗?