python - 在 Python 中使用 Selenium 单击下拉菜单

标签 python selenium xpath css-selectors webdriverwait

我试图通过单击右上角的图片来完成我的脚本,这会导致注销按钮所在的下拉菜单。我可以让 Selenium 识别图片并单击图片以显示下拉菜单,但我无法让它单击最后一个按钮。

这是我尝试单击的注销按钮的网站代码:

<a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_lnkLogout" href="javascript:__doPostBack('ctl00$ctl00$mainContent$MainHeader$HeaderSection$lnkLogout','')"><i class="fa fa-power-off  fa-fw"></i>
                                <span>Log Out</span> </a>

这是整个下拉列表的完整代码。看起来这是一个我第一次没有意识到的列表,但我记得读过您可以按数字选择列表?

<div class="dropdown header-container user-actions-container open">

                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_hypPicture" class="employee-picture" role="button" data-toggle="dropdown" aria-expanded="true"><span id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_imgPicture" alternatetext="Employee Picture" imagealign="Top"><img class="img-rounded" src="https://share.striven.com//pimg/BA4FE360/Employee/thumb-b8598be5-5cd3-48c3-86ab-79fc9985b95e-07252018.jpg"></span></a>




                        <ul class="dropdown-menu dropdown-menu-right">

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl00_lnkAction" href="/HR/Appointments/AppointmentsCalendar.aspx?nav=1"><i class="fa fa-calendar  fa-fw"></i>                                                           
                                          <span>Calendar</span>  

                                        </a></li>

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl01_lnkAction" href="/Finance/Reimbursements/ReimbursementsMyReimbursements.aspx?nav=1"><i class="fa fa-money  fa-fw"></i>                                                           
                                          <span>Expenses</span>  

                                        </a></li>

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl02_lnkAction" href="/HR/ReportBuilder/MyReports.aspx?nav=1"><i class="fa fa-bar-chart   fa-fw"></i>                                                           
                                          <span>Reports</span>  

                                        </a></li>

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl03_lnkAction" href="/AssetManagement/MyAssets/DialogMyAssetList.aspx?nav=1"><i class="fa fa-book   fa-fw"></i>                                                           
                                          <span>Reserved Assets</span>  

                                        </a></li>

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl04_lnkAction" href="/Collaboration/DialogMySubscriptions.aspx?nav=1"><i class="fa fa-envelope-o  fa-fw"></i>                                                           
                                          <span>Subscriptions</span>  

                                        </a></li>

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl05_lnkAction" href="/HR/Timeoff/EmployeeTimeoff.aspx?nav=1"><i class="fa fa-calendar-times-o  fa-fw"></i>                                                           
                                          <span>Time Off</span>  

                                        </a></li>

                                    <li>
                                        <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_rptEmployeeActions_ctl06_lnkAction" href="/HR/TimeAndMaterial/ManageTimeEntry.aspx?nav=1"><i class="fa fa-clock-o  fa-fw"></i>                                                           
                                          <span>Timesheet</span>  

                            <li>
                                <a id="ctl00_ctl00_mainContent_MainHeader_HeaderSection_lnkLogout" href="javascript:__doPostBack('ctl00$ctl00$mainContent$MainHeader$HeaderSection$lnkLogout','')"><i class="fa fa-power-off  fa-fw"></i>
                                <span>Log Out</span> </a></li>
                        </ul>
                </div>

我试图模仿有人在这里帮助我完成几乎相同的事情的代码:

element = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a.hub-content-item[id*='SearchExplorer'][actiontype='Secondary']>span")))

但它不会为我识别它。

最佳答案

你们已经很接近了。 <span>标签不是直接子,因此您需要替换 > 带有空格 字符,您可以使用以下任一 Locator Strategies :

  • 使用 CSS_SELECTOR :

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "a[id$='mainContent_MainHeader_HeaderSection_lnkLogout'] span"))).click()
    
  • 使用 XPATH :

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//a[contains(@id, 'mainContent_MainHeader_HeaderSection_lnkLogout')]//span[text()='Log Out']"))).click()
    
  • 注意:您必须添加以下导入:

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

关于python - 在 Python 中使用 Selenium 单击下拉菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55796381/

相关文章:

python - Flask-SQLAlchemy:如何根据用户的角色和团队进行查询?

vb.net - Selenium:使用 chrome 驱动程序将文件下载到特定文件夹

haskell - 在HXT中进行逻辑或运算而不重复结果

dom - 使用 XPath 查找当前选择的 <option>

python - 有两个程序的 GUI 类

Python:根据两个特征的唯一组合和第三个特征的条件删除重复项

python - Docker flask 应用程序环境变量

oop - 用于自动化测试的页面对象模型对 Web 应用程序有用吗

java - 与 Java 驱动程序一起使用时,如何在 Selenium 中触发链接的单击事件?

xml - Xpath&Xquery:选择和返回带有多个复杂标签的XML元素