我想使用Python WebDriver选择<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