首页 > 解决方案 > 单击带有硒的下拉菜单

问题描述

我正在尝试使用 selenium 在 quizlet.com 上创建抽认卡。如果您访问,您将在导航栏中看到一个“创建”按钮(或只是一个“+”,具体取决于窗口大小),当您单击此按钮时,它会变成一个下拉菜单,其中包含另外 3 个按钮:“学习集”、“文件夹” '和'类'。(我正在尝试单击学习集)

首先,我什至不确定是否需要 selenium 单击第一个“创建”按钮以访问“学习集”按钮,或者我是否可以直接跳到“学习集”按钮。无论如何,这里是分别与“创建”按钮和“学习集”按钮相关的 html:

<button type="button" aria-label="Create"><span>Create</span>/button>

和:(注意,所有 3 个按钮共享类“UILink”,第一个按钮是“学习集”按钮,评论是我的)

<div class="s1ovpdog"> <!-- going to grab this div first because theres 85 elements with the class 'UILink' on the page, grabbing this div cuts it to 3-->
    <button class="UILink" type="button">  <!-- then going to grab this button-->
        <div class="c1ap9d88">
            <div class="iiekfr8">
                <div class="i1q3l8tw">
                    <svg aria-label="sets" class="AssemblyIcon AssemblyIcon--medium" role="img"><noscript></noscript>
                    <use xlink:href="#sets"></use><noscript></noscript></svg><span class="AssemblyMenuItem--title t1nsp0j0">Study set</span>
                </div>
            </div>
        </div>
    </button>
    <button class="UILink" type="button">
        <div class="c1ap9d88">
            <div class="iiekfr8">
                <div class="i1q3l8tw">
                    <svg aria-label="folder" class="AssemblyIcon AssemblyIcon--medium" role="img"><noscript></noscript>
                    <use xlink:href="#folder"></use><noscript></noscript></svg><span class="AssemblyMenuItem--title t1nsp0j0">Folder</span>
                </div>
            </div>
        </div>
    </button>
    <button class="UILink" type="button">
        <div class="c1ap9d88">
            <div class="iiekfr8">
                <div class="i1q3l8tw">
                    <svg aria-label="class" class="AssemblyIcon AssemblyIcon--medium" role="img"><noscript></noscript>
                    <use xlink:href="#class"></use><noscript></noscript></svg><span class="AssemblyMenuItem--title t1nsp0j0">Class</span>
                </div>
            </div>
        </div>
    </button>
</div>

Python代码:

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

driver = webdriver.Chrome('./chromedriver')
driver.get("https://quizlet.com")

# Code to log in to quizlet omitted...

# Grab and click first 'Create' button
create_button = driver.find_element_by_xpath("//button[@aria-label='Create']") # only one element has this aria-label
create_button.send_keys(Keys.RETURN) # doesn't display drop-down menu, makes me think something is wrong here but also does not throw an error
# Grab and click 'Study Set' button
div_containting_study_set_button = driver.find_element_by_class_name('s1ovpdog') # only one element has this class
study_set_button = div_containting_study_set_button.find_elements_by_class_name('UILink')[0] # returns 3 buttons, only need first one
study_set_button.send_keys(Keys.RETURN) # Error,ElementNotInteractableException

当我运行它时,它会抛出

raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotInteractableException: Message: element not interac
table

虽然study_set_button肯定应该引用一个button元素,我相信?感谢您对此的任何帮助。

编辑:搜索后,我找到is_displayed()并运行

create_button.is_displayed() # True
study_set_button.is_displayed() #False

这分别返回TrueFalse。认为我的问题出在某处。

标签: pythonselenium

解决方案


这就是我发现的工作。在下拉列表中找到“学习集”的唯一定位器并不容易。页面上有两个“学习集”元素,DOM 中的第一个不可见。我添加了等待只是为了安全起见,因为您正在单击并且必须加载下拉列表。您可能不需要等待,但为了以防万一,拥有它们不会有什么坏处(它不会减慢任何速度)。

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

wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[aria-label='Create']"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "div.UIOverlayTrigger-content svg[aria-label='sets'] + span"))).click()

推荐阅读