python selenium选择下拉选项,其值匹配正则表达式

时间:2015-03-02 19:08:21

标签: python selenium selenium-webdriver

我正在尝试单击具有以特定字符串结尾的值的下拉选项。

当我拥有完整值时,我只知道如何执行此操作,而不仅仅是部分字符串匹配。

请帮忙!

<select name="dropdown_selected_size_name" autocomplete="off" data-a-native-class="twister-dropdown-highlight" data-a-touch-header="Size" id="native_dropdown_selected_size_name" class="a-native-dropdown twister-dropdown-highlight">
        <option value="0,B0019WTTQE" class="dropdownAvailable" data-a-css-class="dropdownAvailable" id="native_size_name_0" data-a-id="size_name_0" data-a-html-content="6 B(M) US">
            6 B(M) US
        </option>
        <option value="1,B0019WO400" class="dropdownAvailable" data-a-css-class="dropdownAvailable" id="native_size_name_1" data-a-id="size_name_1" data-a-html-content="7 B(M) US">
            7 B(M) US
        </option>
</select>

创建选择对象:

from selenium import webdriver
from selenium.webdriver.support.select import Select
browser = webdriver.Firefox()
browser.get('http://www.amazon.com/dp/B0019WTTQE')
select = Select(browser.find_element_by_id('native_dropdown_selected_size_name'))

尝试一个:

select.select_by_value('B0019WTTQE').click();
  

selenium.common.exceptions.NoSuchElementException:消息:不能   找到值为的选项:B0019WTTQE

尝试二:

select.select_by_value(re.compile(r'B0019WTTQE$')).click();
  

TypeError:类型为'_sre.SRE_Pattern'的参数不可迭代

1 个答案:

答案 0 :(得分:2)

没有内置方式来匹配正则表达式的选择选项。

您必须迭代options并检查每一项:

select = Select(browser.find_element_by_id('native_dropdown_selected_size_name'))

pattern = re.compile(r'B0019WTTQE$')
for option in select.options:
    value = option.get_attribute('value')
    if pattern.search(value):
        option.click()
        break

另一种可能的解决方案是使用 ends-with CSS选择器

select = browser.find_element_by_id('native_dropdown_selected_size_name')

option = select.find_element_by_css_selector('option[value$=B0019WTTQE]')
option.click()

请注意,还有 ends-with() xpath函数,但它是part of XPath 2.0,根据我的理解,浏览器不支持。 contains()绝对不是直接替代方案,但也适用于您的用例:

select = browser.find_element_by_id('native_dropdown_selected_size_name')

option = select.find_element_by_xpath('.//option[contains(@value, "B0019WTTQE")]')
option.click()