selenium学习笔记(全)

    • selenium
          • 元素定位
            • 基本语句
              • find_element('key','value')
                • 有多个元素符合定位条件时仅返回第一个,若没有则抛出异常
                find_element_by_key('value')
                • 有多个元素符合定位条件时仅返回第一个,若没有则返回none
                find_elements('key','value')
                • 以列表形式返回符合条件的所有元素,若没有则返回空列表
              基础知识
              • 兄弟元素
                • 同缩进
                父子元素
                • 差级缩进
              id
              • 不重复,仅有一个
              name
              • 有可能一个名字有多个元素共用,定位时只按顺序返回第一个
              • 使用find_elements('name','value')[num],使用list定位元素
              • 注:元素位置下标从0开始
              class name(特指具有class属性的元素)
              • 包含多个类的元素叫复合样式,不能直接定位,可使用如下的css selector定位
              tag name
              • 一般用于同类元素,比如说input
                返回同类元素的个数
                • elements = driver.find_elements('tag name', 'input') print(len(elements))
              link text<a>
              • 完整超链接a标签
                • <a href="xxx" target="xxx">完整文字</a>
              partial link text<a>
              • 部分超链接a标签
                • <>部分文字<>
              xpath(万能,可在chrome中$x调试)
              • 绝对路径法(需要从根逐级写到元素位置 )
                • ('xpath','/html/xxx..../xxx')
                相对路径法(从定位元素往上找到能唯一定位的父元素为止)
                • ('xpath','//唯一父元素/tr[3]/td[2]/xxx')
                • ('xpath','//唯一父元素/tr[3]//xxx')
                • 注:相同标签元素可直接用‘标签[顺序]’
                • 注:有省略时可同时使用多个//
                • 注:元素位置下标从1开始
                属性定位
                • 单属性:('xpath',"//元素标签[@属性='属性值']")
                • 多属性:('xpath',"//元素标签[@属性1='属性值'][@属性2='属性值']")
                • 注意单双引号
                • 若定位元素属性过多,可先找到具有唯一属性的父元素,再通过相对路径找到定位元素
                模糊定位
                • 模糊定位中的text()表示查找元素文本
                • ('xpath',"//元素标签或*号[contains(text(),‘元素中包含的文本关键字’)]")
                • ('xpath',"//元素标签或*号[contains(@属性名,‘属性中包含的关键字’)]")
                调试-在Chrome中检验Xpath的有效性
                • 调试台-Console
                • 语法:$x("Xpath")
              css selector(万能,可在chrome中$$调试)
              • 利用元素标签定位所有相同的元素
                • find_element('css selector','tr')
                class属性定位(可定位复合样式)
                • 属性前加.
                  find_element('css selector','.属性1.属性2')
                  •  
                id属性定位
                • id前加#
                  • find_element('css selector','#属性名')
                多属性定位
                • find_element('css selector',”[属性1=‘属性名’][属性2=‘属性名’]“)[元素位置list下标)]
                • 注:元素位置下标从0开始
                利用标签父子关系定位
                • driver.find_element('css selector', 'tbody > tr:nth-child(1) > td:nth-child(2) > input')
                • 注:元素位置下标从1开始
                  爷孙关系:可直接加空格
                  • find_element('css selector', 'tbody > tr:nth-child(3) i')
                模糊定位:*=
                • find_element('css selector', '标签[属性名*=“属性所含关键字"]')
              • 调试语法:$x("Xpath")
              总结
              • 方式选择
                • 优先考虑id,name等简单的定位方式
                • xpath功能强悍但性能较差
                • 一组元素优先考虑name或tag name
                • 链接用link text或partial link text
                注意事项
                • 找唯一属性
                • 优先相对路径
                • 不要使用唯一属性定位
                • 多与研发沟通,尽量加上id,name,减少不合理页面的元素,排除重复id
            元素等待
            • improt time
              强制等待
              • time.sleep()
              • 效率低,不能大量使用
              隐式等待
              • driver.implicitly_wait()
              • 只需设置一次,全局有效
              • 设置的为最长等待时间
              • 元素出现即刻停止等待
              显示等待
              • 语法操作
                • 导入
                  • from selenium.webdriver.support.wait import WebDriverWait
                  • from selenium.webdriver.support import expected_conditions as EC
                  常见EC方法
                  • title_is(strtitle)
                    • 判断title是否为精确预期值
                    title_contains(strtitle)
                    • 判断title是否包含指定字符串
                    presence_of_element_located(locator)
                    • 判断元素是否在dom树内,不代表元素一定可见
                    visibility_of_element_located(locator)
                    • 判断元素是否可见,可见代表非隐藏,并且元素宽高皆不为0
                    invisibility_of_element_located(locator)
                    • 判断元素是否不可见
                    element_to_be_clickable(locator)
                    • 判断某个按钮元素是否可见并且enable的,这样的话才叫可点击
                    text_to_be_present_in_element(locator,txet)
                    • 判断某个元素中的text是否包含预期字符串
                  使用示例
                  • WebDriverWait(driver,5).until(EC.text_to_be_present_in_element(('id','msg'),'出错啦'))
                  • 说明:locator为定位方法
              • 可针对每一个元素进行单独设置
              • 若显示隐式等待同时设置,则以最长等待时间为准
            元素操作
            • 常用简单操作
              • clear
                • 清楚文本框内文字
                send_keys
                • 发送文字
                click
                • 点击
                text
                • 获取标签之间(节点)的文本信息
                get_attribute(name)
                • 获取元素的属性信息
                is_displayed
                • 判断元素是否会显示出来
                is_enabled
                • 判断是否可用
                is-selected
                • 判断是否选中
                maximize_window()
                • 窗口最大化
              常用复合操作
              • 复选框常见操作
                • is_displayed() is_enabled() is_selected()
                发送复合按键
                • from selenium.webdriver.common.keys import Keys send_keys(Keys.SHIFT,"xxx")
                  • 示例:send_keys(Keys.CONTRAL+'a')
                    • 全选
                下拉列表常见3个操作
                • from selenium.webdriver.support.ui import Select
                  • Select(driver.find_element('tag name', 'select')).select_by_index(3)
                    • 以顺序选择
                    Select(driver.find_element('tag name', 'select')).select_by_value('sh')
                    • 以value选择
                    Select(driver.find_element('tag name', 'select')).select_by_visible_text('成都')
                    • 以文本选择
              frame
              • switch_to.frame()
                • 从A frame切到B frame
                  • 示例:driver.switch_to.frame(driver.find_element('id', 'login_frame'))
                switch_to.default_content()
                • 从B frame切回A frame
              文件上传
              • 定位type=file的元素
              • 直接使用send_keys(r"本地文件绝对路径")
              多窗口切换
              • curhandle = driver.current_window_handle
                • 保留当前窗口的句柄
                allhandle=driver.window_handles
                • 获取所有窗口
                if handle in allhandle: if handle != curhandle:
                • 遍历所有窗口并判断是否为当前窗口
                driver.switch_to.window(curhandle)
                • 切换至当前窗口
                driver.window_handles[num]
                • 以list下标指定窗口(从0开始)
              悬浮菜单
              • from selenium.webdriver.common.action_chains import ActionChains
                • 导入
                item = driver.find_element('id', 's-usersetting-top')
                • 定位悬浮菜单元素并使其成为对象
                ActionChains(driver).move_to_element(item).perform()
                  • 模拟鼠标的移动操作
              • find_element()定位悬浮菜单内的元素
                ajax类下拉菜单(百度搜索指引)
                  • 用class定位一整类元素并返回成列表对象,再利用列表下标指定某个元 
posted @ 2022-03-20 15:35  Ken3  阅读(161)  评论(0)    收藏  举报