selenium笔记7:处理button group&button dropdown

1. 处理button group

# -*- coding:utf-8 -*-
"""
@author:百草Lily
@file:deal_path.py
@time:2021/4/27
"""
from time import sleep
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from common.deal_path import get_url

"""
处理button group
场景:button group即按钮组,将一组按钮排列在一起。处理这种对象的思路一般是先找到button group的包裹(wrapper)div,
然后通过层级定位,用index或属性去定位更具体的按钮
<div class="btn-group">
    <div class="btn">first</div>
    <div class="btn">second</div>
    <div class="btn">third</div>
</div>
"""
driver = Chrome()
driver.implicitly_wait(10)
driver.get(get_url("button_group.html"))

# 定位第2个按钮
buttons_ele = (By.CLASS_NAME, "btn")
buttons = driver.find_elements(*buttons_ele)
WebDriverWait(driver, 5, 0.5).until(
    EC.visibility_of_element_located(buttons_ele)
)
for btn in buttons:
    if btn.text == "second":
        print("find second button!")
        btn.click()
        print(btn)


sleep(2)
driver.quit()

# error1:
# btn.click()
# selenium.common.exceptions.UnexpectedAlertPresentException: Alert Text: second
# Message: unexpected alert open: {Alert text : second}
# why? 点击打开alter窗

2. 处理 button dropdown


"""
处理button dropdown
场景:button dropdown就是把按钮和下拉菜单弄到一起。
处理这种对象的思路一般是:先点击这个按钮,等待下拉菜单显示出来,然后使用层级定位方法来获取下拉菜单中的具体项
<div class="btn-group open">
    <a class="btn dropdown-toggle btn-info" data-toggle="dropdown" href="#">
        Info
        <span class="caret"></span>
    </a>
    <ul class="dropdown-menu">
        <li><a href="#">watir-webdriver</a></li>
        <li><a href="#">better than</a></li>
        <li><a href="#">selenium-webdriver</a></li>
    </ul>
</div>
"""
driver = Chrome()
driver.implicitly_wait(10)
driver.get(get_url("button_dropdown.html"))
try:
    # 点击按钮
    driver.find_element(By.CLASS_NAME, "btn-group").click()
    locator = (By.CLASS_NAME, "dropdown-menu1")
    # 方式1:EC
    # WebDriverWait(driver, 5, 0.5).until(
    #     EC.visibility_of_element_located(locator)
    # )
    
    # 方式2:轮询默认0.5s;lambda函数
    WebDriverWait(driver, 10).until(
        lambda the_driver: the_driver.find_element_by_class_name('dropdown-menu').is_displayed()
    )
    driver.find_element(*locator).click()

    time.sleep(2)
    driver.quit()
except Exception as e:
    killtask()
    print(e)

3. 定位navs

"""
处理navs
场景:navs类似tab的导航栏。一般来说导航栏都是ul+li.先定位ul再去定位li中的link即可
<ul class="nav nav-pills">
    <li class="active">
        <a href="#">Home</a>
    </li>
    <li>
        <a href="#">Content</a>
    </li>
    <li>
        <a href="#">About</a>
    </li>
</ul>
"""
driver = Chrome()
driver.get(get_url("navs.html"))
driver.find_element(By.CLASS_NAME, "nav-pills").find_element(By.LINK_TEXT, "Content1").click()
driver.quit()

4. 处理面包屑

面包屑,即页面上的路径展示
"""
处理breadcrumb
场景:获取其层级关系,以及当前的层级
一般来说,当前层级都不会是链接,而父级则基本以链接
所以处理面包屑,需找到所在div或url,然后通过该div或url找到下面所有的链接就是父层级
最后不是链接的部分就应该是当前层级了
<div class="span3">
    <ul class="breadcrumb">
        <li><a href="#">Home</a> <span class="divider">/</span></li>
        <li><a href="#">Library</a> <span class="divider">/</span></li>
        <li class="active">Data</li>
    </ul>
</div>
"""
driver = Chrome()
driver.implicitly_wait(10)
driver.get(get_url("breadcrumb.html"))

ancestors = driver.find_element(By.CLASS_NAME, "breadcrumb").find_elements(By.TAG_NAME, "a")
for ancestor in ancestors:
    print(ancestor)
time.sleep(2)
driver.quit()

# 输出结果:
# <selenium.webdriver.remote.webelement.WebElement (session="30b8583e70629f200ba37ea03953c35d", element="12000bff-3f3e-4d54-b0d8-bbd7cf9f2bdf")>
# <selenium.webdriver.remote.webelement.WebElement (session="30b8583e70629f200ba37ea03953c35d", element="fccf1dcc-d070-4c6c-93d9-e35adb4586a8")>

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容