2015-03-02 3 views
2

Я пытаюсь щелкнуть выпадающий вариант, который имеет значение, заканчивающееся на определенную строку.python selenium select dropdown option with value matching regex

Я знаю, как это сделать, когда у меня есть полная ценность, а не только частичное совпадение строк.

Пожалуйста, помогите!

<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: Message: Cannot locate option with value: B0019WTTQE

Покушение два:

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

TypeError: argument of type '_sre.SRE_Pattern' is not iterable

ответ

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() 
+0

Большое спасибо за подробный ответ. Второе решение дает мне следующую ошибку: AttributeError: выбор экземпляра не имеет атрибута 'find_element_by_css_selector'. Я тоже что-то пробовал по этим строкам с тем же результатом, а также не нашел методов find_element в [docs] (http://selenium-python.readthedocs.org/en/latest/api.html#module-selenium. webdriver.support.select) – Imran

+0

@Имран вы правы, извините, исправлено. – alecxe

+0

Похоже, что ваше исправление не было сохранено? – Imran