<option>
的<select>
子级子。 > 选择
WebElement
的正确方法是什么?#1 楼
我发现的最简单的方法是按照以下方式进行操作:el = driver.find_element_by_id('id_of_select')
for option in el.find_elements_by_tag_name('option'):
if option.text == 'The Options I Am Looking For':
option.click() # select() in earlier versions of webdriver
break
此代码也可以与多选功能配合使用br />
def multiselect_set_selections(driver, element_id, labels):
el = driver.find_element_by_id(element_id)
for option in el.find_elements_by_tag_name('option'):
if option.text in labels:
option.click()
进入此呼叫
# ERROR: Caught exception [ERROR: Unsupported command [addSelection | id=deformField7 | label=ALL]]
多个选择错误,如下所示:
multiselect_set_selections(driver, 'deformField7', ['ALL'])
只需一个电话即可解决:
# ERROR: Caught exception [ERROR: Unsupported command [addSelection | id=deformField5 | label=Apr]]
# ERROR: Caught exception [ERROR: Unsupported command [addSelection | id=deformField5 | label=Jun]]
评论
我刚刚看到您回答了自己的问题,哎呀:)
–杰森·沃德(Jason Ward)
2011年7月7日13:30
不用担心杰森。我本人想尽早回答,但必须经过六个小时。无论如何,我都会给你荣誉:)
–约翰·凯斯(John Keyes)
2011年7月7日在21:41
@JasonWard如何在for循环中遍历Web元素对象。我尝试了相同的操作,但得到了对象不可迭代的异常。任何建议。谢谢
– Abhi
13年4月18日在9:53
@abhi确保您使用的是find_elements_by_tag_name而不是find_element_by_tag_name(元素中的s很重要)。
–杰森·沃德(Jason Ward)
13年7月24日在1:43
好的解决方案,但不及Daniel Abel提出的解决方案。使用内置的“选择”功能更好
–克里斯·比尔(Chris Bier)
2014年3月27日在16:04
#2 楼
我认为使用selenium.webdriver.support.ui.Select
是最干净的方法:from selenium import webdriver
from selenium.webdriver.support.ui import Select
b = webdriver.Firefox()
# navigate to the page
select = Select(b.find_element_by_id(....))
print select.options
print [o.text for o in select.options] # these are string-s
select.select_by_visible_text(....)
使用这种方法也是最快的方法。我将
fast_multiselect
写为与multiselect_set_selections
类似的功能。在一个对multiselect_set_selections
进行4次调用的测试中,每个列表大约有20个项目,平均运行时间为16.992秒,而fast_multiselect
仅为10.441秒。同样,后者要简单得多。 from selenium.webdriver.support.ui import Select
def fast_multiselect(driver, element_id, labels):
select = Select(driver.find_element_by_id(element_id))
for label in labels:
select.select_by_visible_text(label)
评论
这有效并且是一个很好的解决方案。
–迈克·格雷斯(Mike Grace)
2012年6月1日4:00
真好硒自动生成的文档简直糟透了。
–斯坦
2012-09-27 13:07
这是惯用的方法。太糟糕了,这不是公认的答案。
–卢卡斯·施瓦茨(Lucas Schwarz)
15年4月28日在19:13
这应该是公认的答案
– Nam G VU
17年6月20日在7:57
#3 楼
与Will的答案类似,但根据元素名称找到<select>
,然后根据<option>
文本单击。from selenium import webdriver
b = webdriver.Firefox()
b.find_element_by_xpath("//select[@name='element_name']/option[text()='option_text']").click()
评论
这对我有用,它使用“ // select [@ name ='element_name'] / option [@ value ='2']”通过其值选择一个选项(以防您担心选项文本的更改)。值得学习有关IMO的xpath。 selenium-python.readthedocs.org/…
–亚当·斯塔斯塔(Adam Starrh)
15年12月26日在20:25
#4 楼
我有一个类似的问题,可以通过xpath查找元素来解决:from selenium import webdriver
b = webdriver.Firefox()
#...some commands here
b.find_element_by_xpath("//select/option[@value='The Options I am Looking for']").click()
#5 楼
更轻松地操作下拉菜单的方法from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver.get("link")
select = Select(driver.find_element_by_id('<given id name>'))
select.select_by_index(3)
#6 楼
使用facebook / php-webdriver的最新重写版本(1.0.1):$optionCssSelector = WebDriverBy::cssSelector("#order_images_row_wrapper .order-wrapper .merge-image-select option[value='2']");
$this->driver->findElements($optionCssSelector)[0]->click();
评论
那是您到那里来的一些看起来很强大的奇怪Python。
– XtrmJosh
16年1月1日在13:26
评论
噢,骗我,当然可以。在默认的