无法单击下拉列表硒中的选项

时间:2018-06-20 03:19:18

标签: python selenium selenium-webdriver qa

我尝试使用“选择”模块,但是当我这样做时,元素要么不可交互,要么“不可见”。这是相关的代码。

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's not public yet, so I won't show the set-up here,but if it's 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模块在这种情况下工作?欢迎任何有启发性的回应!

6 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

非常感谢您的答复!不幸的是,在这种情况下,问题实际上不在于等待:/

对我有用的是动作链。动作链之所以起作用,是因为您不必定位元素。所以在我的帖子中我提到我可以单击下拉列表,并且向下箭头不起作用,因为它给出了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()

答案 2 :(得分:0)

尝试一下。

n

答案 3 :(得分:0)

您需要等待一会(2秒),然后再执行“选择”操作。您可以使用“显式等待”或“睡眠”。这将解决FirefoxChrome问题。

明确等待

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 )

答案 4 :(得分: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')  

希望这会有所帮助。

答案 5 :(得分:0)

首先单击下拉列表,

accountspageobj.select_user_dropdown_on_assign_eventpage().click();

使用以下动作类在动态下拉菜单中选择值。

Actions s= new Actions(driver);
s.sendKeys(accountspageobj.select_user_dropdown_on_assign_eventpage(), Keys.chord(Keys.DOWN,Keys.DOWN,Keys.ENTER)).build().perform();