【问题标题】:Selecting an item from the dropdown menu of a list using Python + Selenium使用 Python + Selenium 从列表的下拉菜单中选择一个项目
【发布时间】:2019-04-17 23:48:58
【问题描述】:

我正在尝试使用 Python 中的 Selenium 从无序列表中选择一个元素。我当前的代码点击下拉菜单并打开它,但我无法让它点击列表中的项目。

我正试图让它点击非活动。

这是 HTML sn-p:

<form method="post" action="/user/admin/user/practice/edit/18" id="qf_admin_practice_edit" class="qf-form"
      onsubmit="return validate(this)">
    <fieldset id="qf_admin_practice_edit__data" class="qf-fieldset">
        <legend>Edit Practice</legend>
        <div class="qf-select-wrapper" id="qf_admin_practice_edit__data__status_id__wrapper">
        <span class="qf-label-span" id="qf_admin_practice_edit__data__status_id__label_span">
            <label id="qf_admin_practice_edit__data__status_id__label" for="qf_admin_practice_edit__data__status_id">Practice Status</label>
        </span>
            <span class="qf-select-span" id="qf_admin_practice_edit__data__status_id__span">
            <span class="qf-select-inner" id="qf_admin_practice_edit__data__status_id__inner">
                <div class="selectric-wrapper selectric-qf-select selectric-above selectric-open">
                    <div class="selectric-hide-select">
                <select title="Practice Status" name="admin_practice_edit__data__status_id"
                        id="qf_admin_practice_edit__data__status_id" class="qf-select" tabindex="-1">
                    <option value="1" class="qf-option">Active</option>
                    <option value="2" class="qf-option">Inactive</option>
                    <option value="3" class="qf-option">Pending</option>
                    <option value="4" class="qf-option">Billing Suspension</option>
                    <option value="5" class="qf-option">Activity Suspension</option>
                    <option value="6" class="qf-option">Declined</option>
                    <option value="7" selected="selected" class="qf-option">Deleted</option>
                    <option value="8" class="qf-option">Cancelled</option>
                    <option value="9" class="qf-option">Reschedule</option>
                    <option value="10" class="qf-option">Expired</option>
                    <option value="11" class="qf-option">New</option>
                </select>
                    </div>
                    <div class="selectric">
                    <span class="label">Deleted</span>
                        <b class="button">▾</b>
                </div>
                    <div class="selectric-items" tabindex="-1" style="width: 718px; height: 300px;">
                        <div class="selectric-scroll">
                            <ul>
                                <li data-index="0" class="qf-option">Active</li>
                                <li data-index="1" class="qf-option">Inactive</li>
                                <li data-index="2" class="qf-option">Pending</li>
                                <li data-index="3" class="qf-option">Billing Suspension</li>
                                <li data-index="4" class="qf-option">Activity Suspension</li>
                                <li data-index="5" class="qf-option">Declined</li>
                                <li data-index="6" class="qf-option selected highlighted">Deleted</li>
                                <li data-index="7" class="qf-option">Cancelled</li>
                                <li data-index="8" class="qf-option">Reschedule</li>
                                <li data-index="9" class="qf-option">Expired</li>
                                <li data-index="10" class="qf-option last">New</li>
                            </ul>
                        </div>
                    </div>
                    <input class="selectric-input" tabindex="0">
                </div>
        </span>
      </span>
        </div>
    </fieldset>
    <div class="qf-button-wrapper" id="qf_admin_practice_edit__submit__wrapper">
        <button type="submit" value="Submit" id="qf_admin_practice_edit__submit" class="qf-button">
            <span>Submit</span>
        </button>
    </div>
    <div>
        <input value="2449978437" type="hidden" name="qf" class="qf-hidden-input qf-input">
    </div>
</form>

我正在选择/打开下拉菜单:

clickDropDown = driver.find_element_by_id('qf_admin_practice_edit__data__status_id__wrapper').click()

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    想通了,但这是一个我不喜欢的丑陋解决方案,但它有效。

            openDropDown = driver.find_element_by_id('qf_admin_practice_edit__data__status_id__wrapper').click()
            swapToActive = driver.switch_to.active_element
            swapToActive.send_keys(Keys.UP)
            swapToActive.send_keys(Keys.UP)
            swapToActive.send_keys(Keys.UP)
            swapToActive.send_keys(Keys.UP)
            swapToActive.send_keys(Keys.UP)
            swapToActive.send_keys(Keys.RETURN)
    

    【讨论】:

      【解决方案2】:

      您的定位器ID 识别Select 元素是错误的。但是选择一个元素不需要单击该元素。您可以先通过定位器分配选择元素,然后使用以下方法访问元素。

      element.select_by_visible_text("text")
      element.select_by_index(index number)
      element.select_by_value("option value")
      

      但是,访问任何网页时最好使用WebDriverWait。我提供了代码,希望对您有所帮助。

      from selenium.webdriver.common.by import By
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions
      from selenium import webdriver
      from selenium.webdriver.support.select import Select
      
      driver=webdriver.Chrome()
      driver.get("url here")
      dropdownelement=WebDriverWait(driver,20).until(expected_conditions.element_to_be_clickable((By.ID,'qf_admin_practice_edit__data__status_id')))
      select=Select(dropdownelement)
      select.select_by_visible_text("Inactive")
      

      select.select_by_index(1)
      

      select.select_by_value("2")
      

      【讨论】:

      • 谢谢!但这会引发 TimeoutException 错误:raise TimeoutException(message, screen, stacktrace) TimeoutException
      • @BobG : 你能检查元素是否在任何 iframe 内吗?
      • 它不在 iframe 中。我在主帖中更新了 HTML 代码的 sn-p,检查一下,但我知道这是否有帮助
      • @BobG : 只是好奇是这个主页还是主页上的任何子窗口?
      • 我认为它是一个子窗口,但我不完全确定,它是位于另一个页面上的下拉菜单,还有另一个下拉菜单,截图:i.imgur.com/RVuwMwC.png
      【解决方案3】:

      所需的DropDown 不是&lt;select&gt; 标记,因为它具有class 属性 作为selectric-hide-select。要在 DropDown 中使用 Selenium 通过 Python 在文本为 Active 的元素上 click(),您需要诱导 WebDriverWait 并且您可以使用以下任一Locator Strategies:

      • 使用CSS_SELECTOR

        driver.find_element_by_css_selector("div.qf-select-wrapper#qf_admin_practice_edit__data__status_id__wrapper").click()
        WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.selectric-items>div.selectric-scroll li.qf-option[data-index='0']"))).click()
        
      • 使用XPATH

        driver.find_element_by_xpath("//div[@class='qf-select-wrapper' and @id='qf_admin_practice_edit__data__status_id__wrapper']").click()
        WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@class='selectric-items']/div[@class='selectric-scroll']//li[@class='qf-option' and text()='Active']"))).click()
        
      • 注意:您必须添加以下导入:

        from selenium.webdriver.support.ui import WebDriverWait
        from selenium.webdriver.common.by import By
        from selenium.webdriver.support import expected_conditions as EC
        

      【讨论】:

      • 嗨,这是抛出:raise TimeoutException(message, screen, stacktrace) TimeoutException
      • 查看更新的答案并让我知道状态
      • 仍然引发 TimeoutException :(
      • 是否下拉菜单并打开它,因为我以css_selectorxpath 的形式使用了您的id
      • 是的,它会打开下拉菜单,但似乎无法单击或选择菜单中的选项。程序在抛出该错误之前到达的位置的屏幕截图:i.imgur.com/sW2KkDQ.png
      【解决方案4】:

      您应该能够通过文本或它的值来选择选项:

      dropDown = Select(driver.find_element_by_id("admin_practice_edit__data__status_id"))
      dropDown.click()
      # Select by text
      dropDown.select_by_visible_text("Inactive")
      # or by value
      dropDown.select_by_value('2')
      

      您可以在此处找到有关使用下拉菜单的更多信息:https://seleniumhq.github.io/selenium/docs/api/py/webdriver_support/selenium.webdriver.support.select.html

      【讨论】:

      • 返回:UnexpectedTagNameException: Select 仅适用于
      • @RKelley 将您的定位器更改为 "qf_admin_practice_edit__data__status_id",它应该可以工作 - 您想要定位 &lt;select&gt; 元素本身。
      • @TodorMinakov 尝试改变它,但它似乎仍然不起作用
      • @TodorMinakov 谢谢!我应该仔细看看id。我是从代码而不是 html 中获取的。
      猜你喜欢
      相关资源
      最近更新 更多
      热门标签