Невозможно выбрать опцию в выпадающем списке селен

1

Я попытался использовать модуль Select, но когда я делаю элемент, он либо не взаимодействует, либо "невидим". Вот соответствующие коды.

HTML

    < head >
    < script >

        function onChangeCardType() {
            var value = $('#card_type').val();
            $('#img_' + value).siblings().hide();
            $('#img_' + value).show();
        }

    </script>

</head>

<body>
    <table>
        <thead>

            <tr>
                <th align="left">Card type</th>
                <td colspan="2" style="font-size:12px;">
                    <select name="requestDTO.vpc_card" id="card_type" onchange="onChangeCardType()"
                            class="select required"
                            style="width: 342px; font-size:12px;">
                        <option value="Amex" >American Express</option>
                        <option value="Mastercard" >MasterCard</option>
                        <option value="Visa" >Visa</option>
                        <option value="JCB" >JCB</option>
                    </select>
                    <a class="ui-selectmenu ui-widget ui-state-default select required ui-selectmenu-dropdown ui-corner-all" id="card_type_button_435" role="button" href="#" aria-haspopup="true" aria-owns="card_type_menu_435" aria-expanded="false" tabindex="0" style="width: 336px;"><span class="ui-selectmenu-status">Visa</span><span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s"></span></a>
                        <span class="ui-selectmenu-status">Visa</span>

                        <span class="ui-selectmenu-icon ui-icon ui-icon-triangle-1-s"></span>

                </td>
            </tr>

         </thead>
    </table>
</body>

Код

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By

from time import sleep
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

from selenium.webdriver.support.ui import Select

#testing on a website that not public yet, so I won't show the set-up here,but if it required I can too

cardtype = Select(driver.find_element_by_id("card_type"))
cardtype.select_by_value("Mastercard")
sleep(1)
driver.implicitly_wait(2)


Using Firefox: ElementNotInteractableException:
Element <option> could not be scrolled into view


Using Chrome:
ElementNotVisibleException: element not visible: 
Element is not currently visible and may not be manipulated

# sleep nor implicitly_wait doesn't help too...

Я также попробовал просто щелкнуть по ящику (не используя тег select, я мог бы щелкнуть по нему, используя class="ui-selectmenu", но .send_keys(KEYS.ARROW_DOWN) не работает (дает AttributeError).

Есть ли способ идентифицировать текст в опции и нажимать на него, не используя модуль Select? Или я могу заставить модуль Select работать в этом случае? Любые осветительные ответы приветствуются!

Теги:
selenium
selenium-webdriver
qa

5 ответов

1
Лучший ответ

Большое спасибо за ответы! К сожалению, проблема в этом случае была не в ожидании:/

Однако то, что работало для меня, было Action Chains. Действия Цепочки работают, потому что вам не нужно настраивать таргетинг на элемент. Поэтому в своем посте я упомянул, что могу щелкнуть раскрывающийся список, и стрелки вниз не работали, потому что он дал атрибут AttributeError. Однако это было связано с тем, что я попытался настроить этот элемент!

Итак, вот ответ, который работал на меня:

cardtype = driver.find_elements_by_class_name("ui-selectmenu-status")
cardtype.click()

actions = ActionChains(driver)
actions.send_keys(Keys.ARROW_DOWN)
actions.send_keys(Keys.ENTER)
actions.perform()
1

Вы можете использовать select_by_index. Я лично рекомендую вместо ценности

cardtype = Select(driver.find_element_by_id("card_type"))
cardtype.select_by_index(1)  // 0 - AMEX , 1 - MasterCard and so on
  • 2
    select_by_value как Mastercard была правильной
  • 0
    @DebanjanB - Да, ты прав. Моя вина. Я буду редактировать это.
0

Вы можете попробовать этот код:

WebDriverWait(driver, 20).until(
EC.visibility_of_element_located((By.ID, "card_type")))  
cardtype = Select(driver.find_element_by_id('card_type'))
cardtype.select_by_value("Mastercard")  
#OR  

cardtype.select_by_visible_text('MasterCard')  

Надеюсь, это будет полезно.

  • 0
    Спасибо за ответ! К сожалению, это не сработало, и через двадцать секунд появилась эта ошибка, которая raise TimeoutException(message, screen, stacktrace) TimeoutException и это форма, поэтому выпадающая панель всегда будет там. Есть ли причина, по которой мы должны использовать видимость element_located?
0

Вам нужно подождать некоторое время (2 секунды), перед выборами. Вы можете использовать Explicit Wait или sleep. Это решит проблему Firefox а также проблему Chrome.

Явный Ожидание:

from selenium.webdriver.support import expected_conditions as EC
element = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.ID, "card_type")))

Сон:

import time
time.sleep( 5 )
0

Попробуй это.

your_choice=driver.find_element_by_xpath("//select[@id='card_type']/option[@value='Mastercard']")
your_choice.click()

Ещё вопросы

Сообщество Overcoder
Наверх
Меню