Выберите вариант раскрывающегося списка через Selenium

Настраивать

Я пытаюсь выбрать страну из раскрывающегося меню WooCommerce.

<select name = "shipping_country" id = "shipping_country" class = "country_to_state country_select select2-hidden-accessible" autocomplete = "country" tabindex = "-1" aria-hidden = "true" style = "">
    <option value = "">Selecteer een land…</option>
    <option value = "BE">België</option>
    <option value = "DE">Duitsland</option>
    <option value = "FI">Finland</option>
    <option value = "FR">Frankrijk</option>
    <option value = "HU">Hongarije</option>
    <option value = "NL" selected = "selected">Nederland</option>
    <option value = "AT">Oostenrijk</option>
    <option value = "PL">Polen</option>
    <option value = "ES">Spanje</option>
    <option value = "GB">Verenigd Koninkrijk (UK)</option>
</select> 

Я пробовал свой обычный способ использования Select() и экспериментировал с ActionChains, но безрезультатно.


Пытается

  • Выберите 1

Select(el_id('shipping_country')).select_by_value(latest_order['shipping']['country'])

где el_id() = browser.find_element_by_id() и latest_order['shipping']['country'] содержат двухбуквенный код страны доставки.

Это дает ElementNotInteractableException: Element <option> could not be scrolled into view.

  • Выберите 2

Я также пробовал вставить "подождите",

dropdown = Select(el_id('shipping_country'))
wait.until(EC.element_to_be_clickable((
        By.XPATH, "//select[@id='shipping_country']//options[contains(.," + latest_order['shipping']['country'] +")]")))
dropdown.select_by_value(latest_order['shipping']['country'])

где wait = WebDriverWait(browser, 10).

Это дает TimeoutException.

  • ActionChains

На основе отвечать,

dropdown = el_xp("//select[@name='shipping_country']")
actions = ActionChains(browser)
actions.move_to_element(dropdown)
actions.click(dropdown)
select_box = Select(dropdown)
actions.move_to_element(select_box.select_by_value(latest_order['shipping']['country']))

Это дает,

Traceback (most recent call last):

  File "<ipython-input-43-a82c544929aa>", line 1, in <module>
    actions.move_to_element(select_box.select_by_value(latest_order['shipping']['country']))

  File "/Applications/anaconda/lib/python3.6/site-packages/selenium/webdriver/common/action_chains.py", line 289, in move_to_element
    self.w3c_actions.pointer_action.move_to(to_element)

  File "/Applications/anaconda/lib/python3.6/site-packages/selenium/webdriver/common/actions/pointer_actions.py", line 42, in move_to
    raise AttributeError("move_to requires a WebElement")

AttributeError: move_to requires a WebElement

Как мне решить эту проблему?

Вы пытаетесь дождаться, пока скрытый элемент станет активным ... Удалите эту строку и повторите попытку. Что такое el_id?

Andersson 02.01.2019 10:30
el_id() = browser.find_element_by_id(). Я посмотрю.
LucSpan 02.01.2019 11:19

Можете ли вы перекрестно проверить, есть ли <ul> и набор <li> рядом с предоставленным вами HTML с аналогичным набором опций?

DebanjanB 02.01.2019 14:47
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
532
2

Ответы 2

вам нужно использовать опцию select_by_value () или select_by_visibletext (). Например, чтобы выбрать опцию Финляндия, вы можете использовать:

 dropdown = Select(el_id('shipping_country'))
//either
 dropdown.select_by_value("FI")  
//or
 dropdown.select_by_visibletext("Finland")

Тогда можно сначала попробовать открыть раскрывающийся список и выбрать значение?

SnR 02.01.2019 11:31

Это была моя вторая попытка. Спасибо за ваши усилия, но ваша помощь может быть даже более полезной, если вы сначала прочтете объяснение в моем вопросе.

LucSpan 03.01.2019 09:13

Почему бы просто не установить атрибут value тега select? Например, если вы хотите выбрать «Финляндия», вы можете сначала получить соответствующее значение следующим образом.

В основном я использую C#, а следующий код написан на C# Selenium.

var state = 'Finland';
xpath = $"//*/select[@id='shipping_country']/option[text()='{state}']";
string value = Driver.FindElementByXPath(xpath).GetAttribute("value");
xpath = "//*/select[@id='shipping_country']";
await set_value(xpath, value);

Следующая функция - это то, что я обычно использую для установки значения для полей ввода.

public async Task<string> set_value(string xpath, string val, string field = "value")
{
        Object node = null;
        string script = "(function()" +
                            "{" +
                                "node = document.evaluate(\"" + xpath + "\", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;" +
                                "if (node==null) return '" + m_err_str + "';" +
                                "node." + field + "=\"" + val + "\";" +
                                "return 'ok';" +
                        "})()";
        node = m_js.ExecuteScript(script);
        if (node != null)
            return node.ToString();
        return m_err_str;
    }

Спасибо, но я использую Python и не знаком с C#.

LucSpan 02.01.2019 11:21

<Я использую Python и не знаком с C#> - Не беспокойтесь. Поиск элемента с помощью XPath также поддерживается в Python, и основная идея должна применяться.

David Piao 02.01.2019 11:28

Другие вопросы по теме