• Selenium基础


    1. selenium简介

    用于实现自动化测试的 python 包,使用前需要安装对应浏览器驱动

    from time import sleep
    from selenium import webdriver
    option = webdriver.ChromeOptions()
    # 指定chrome存储路径的二进制形式
    option.binary_location='D:\Chrome\Google\Chrome\Application\chrome.exe'
    # 获取谷歌浏览器驱动
    driver = webdriver.Chrome(options=option)
    # 浏览器访问指定网站
    driver.get('http://www.baidu.com')
    # 3秒后浏览器关闭
    sleep(3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    2. 控制组件的各种方式

    # 在输入方法之前一定要清空操作
    # 输入值为value的方法【文件上传按钮也使用send_keys(path)而不是click】
    # ele为定位到的组件
    ele.send_keys(value) 
    # 点击方法
    ele.click() 
    # 清空
    ele.clear() 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    driver.find_element(s)

    # 定位到id值为user的组件,并将'admin'填入
    # by另外还能填name,class_name,xpath,css_selector等,返回WebElement单个元素
    driver.find_element(by='id',value='user').send_keys('admin')
    
    • 1
    • 2
    • 3
    from selenium.webdriver.common.by import By
    # find_elements中有s时,by参数需要传入By.xx属性,结果返回是list,装载多个WebElement元素
    # 定位到tag为input的组件,并将'admin'填入第一个input组件中
    driver.find_elements(by=By.TAG_NAME,value='input')[0].send_keys('admin')
    
    • 1
    • 2
    • 3
    • 4

    超链接LINK_TEXT和PARTIAL_LINK_TEXT

    from time import sleep
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    option = webdriver.ChromeOptions()
    # 指定chrome存储路径的二进制形式
    option.binary_location='D:\Chrome\Google\Chrome\Application\chrome.exe'
    driver = webdriver.Chrome(options=option)
    # r是告知字符串内无转义字符
    url = r'D:\个人\学习资料\黑马程序员\Web自动化\web自动化_day01_课件+笔记+资料+代码\02_其他资料\注册实例.html'
    # 打开url对应的网页
    driver.get(url)
    # a标签精确匹配,定位到超链接内容为'注册A网页'的地方
    # ele = driver.find_elements(by=By.LINK_TEXT,value='注册A网页')
    # a标签模糊匹配,定位到所有超链接内容包含'注册'的地方
    ele = driver.find_elements(by=By.PARTIAL_LINK_TEXT,value='注册')
    # 选择第二个定位到的超链接并点击
    ele[1].click()
    # 线程暂停3秒
    sleep(3)
    # 浏览器关闭
    driver.quit()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.1 XPath定位

    XPath是xml path的简称。在html页面中,各组件都有自己的层级结构,通过类似路径的方式定位到组件

    如何在Chrome中查找和验证XPath

    1. 通过绝对路径进行定位,以 /html 开头

      image-20231031154057079
    2. 通过相对路径进行定位,以为 // 开头【后续分隔依然是/】

      image-20231031154840149
    3. 路径 + 属性 + 逻辑 进行定位

      image-20231031155804262
      # 对应的实现代码
      ele = driver.find_elements(by=By.XPATH,
                      value="//p[@id='login_user']/input[@name='user-test' and @class='login']")
      
      • 1
      • 2
      • 3
    4. 通过 xpath 内置方法定位

      # 定位到所有标签中文本内容为xxx的元素
      //*[text()='xxx']
      # 定位到属性中含有xxx的元素【这里的attribute是泛指,可以是id,name等】
      //*[contains(@attribute,'xxx')]
      # 属性以xxx开头的元素
      //*[starts-with(@attribute,'xxx')]
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6

    2.2 css选择器

    CSS 是一种标记语言,用于控制元素的显示样式,在 css 标记语言中找元素使用 css 选择器,极力推荐使用,查找元素的效率比 Xpath 高,语法比 Xpath 更简单

    1. id 选择器(前提:元素是必须有 id 属性)

      // 定位到id值为user的元素
      #user
      
      • 1
      • 2
      # 将name属性为user的第一个元素赋值为admin
      ele = driver.find_elements(by=By.CSS_SELECTOR,value="[name='user']")
      ele[0].send_keys('admin')
      
      • 1
      • 2
      • 3
    2. class 选择器(前提:元素是必须有 class 属性)

      // 定位到class值为group的元素
      .group
      
      • 1
      • 2
    3. 元素选择器

      // 定位到input标签的元素
      input
      
      • 1
      • 2
    4. 属性选择器

      // 定位到name属性为admin的元素【任意属性都可以使用这种方法进行定位】
      [name='admin']
      // input标签中type属性以p字母开头的元素
      input[type^='p']
      // input标签中type属性以p字母结束的元素
      input[type$='p']
      // input标签中type属性包含p字母的元素
      input[type*='p']
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
    5. 层级选择器

      // 定位到严格在p下一层的input元素
      p>input
      // 定位到p下方的input【只要在下方即可】
      p input
      
      • 1
      • 2
      • 3
      • 4

    3. 浏览器常用API

    # 最大化浏览器
    driver.maximize_window() 
    # 设置浏览器大小 单位像素
    driver.set_window_size(w, h) 
    # 设置浏览器位置
    driver.set_window_position(x, y) 
    # 后退操作
    driver.back() 
    # 前进操作
    driver.forward()
    # 刷新操作
    driver.refresh() 
    # 关闭当前主窗口(主窗口:默认启动哪个界面,就是主窗口)
    driver.close() 
    # 关闭由driver对象启动的所有窗口
    driver.quit() 
    # 获取当前页面title信息
    driver.title 
    # 获取当前页面url信息
    drive.current_url 
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • driver.title 和 driver.current_url 没有括号,一般为判断上步操作是否执行成功

    • driver.maximize_window() 一般为我的前置代码,在获取 driver 后,直接编写最大化浏览器

    • driver.close() 与 driver.quit() 区别

      如果当前只有 1 个窗口,close 与 quit 没有任何区别

      • close():关闭当前主窗口
      • quit():关闭由 driver 对象启动的所有窗口

    4. 元素信息操作API

    获取各组件属性值相关API,如获取id,name等属性

    # 获取元素文本
    ele.text
    #获取元素大小  
    ele.size
    # 获取元素id属性值
    ele.get_attribute("id")
    # 判断元素是否可见
    ele.is_displayed()
    # 判断元素是否可用
    ele.is_enabled()
    # 判断元素是否被选中
    ele.is_selected()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • text 和 size 调用时 无括号
    • get_attribute 一般应用场景:判断一组元素是否为想要的元素或者判断元素属性值是否正确
    • is_displayed、is_enabled、is_selected,在特殊应用场景中使用

    5. 鼠标操作API

    通过鼠标操作API模拟测试鼠标的各种效果

    双击
    # 鼠标事件对应的方法在哪个类中ActionChains类中
    from selenium.webdriver.common.action_chains import ActionChains
    action = ActionChains(driver)
    # 所有操作均需经过perform()方法才能展示效果,当需要模拟多步操作时将perform()放在最后执行
    # 右击
    action.context_click(ele).perform()
    # 双击
    action.double_click(ele).perform()
    # 拖拽【source是需要拖拽的组件,target是目标位置组件】
    action.drag_and_drop(source,target).perform()
    # 根据偏移量拖拽
    action.drag_and_drop_by_offset(source,xoffset,yoffset)
    # 悬停
    action.move_to_element(ele).perform()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    6. 键盘操作API

    from selenium.webdriver.common.keys import Keys
    # 删除键
    ele.send_keys(Keys.BACK_SPACE)
    # 空格键
    ele.send_keys(Keys. SPACE)
    # 制表键
    ele.send_keys (Keys.TAB)
    # 回退键
    ele.send_keys(Keys.ESCAPE)
    # 回车键
    ele.send_keys(Keys.ENTER)
    # 全选
    ele.send_keys(Keys.CONTROL , 'a')
    # 复制
    ele.send_keys(Keys.CONTROL , 'c')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    7. 元素等待

    由于电脑配置或网络原因,在查找元素时,元素代码未在第一时间内被加载出来,而抛出未找到元素异常。元素在第一次未找到时,元素等待设置的时长被激活,如果在设置的有效时长内找到元素,继续执行代码,

    7.1 隐式等待

    设置后对所有组件都会等待

    # 找不到组件时等待10秒
    driver.implicitly_wait(10)
    
    • 1
    • 2

    7.2 显示等待

    只等待指定组件

    from selenium.webdriver.support.wait import WebDriverWait
    # 每隔0.5秒尝试寻找一次id值为d的组件,共持续10秒
    wait_rule = WebDriverWait(driver,timeout=10,poll_frequency=0.5)
    # until()参数为匿名函数,其中x是创建等待规则时传入的driver类
    # 按照wait_rule的规则寻找id为user的组件
    ele = wait_rule.until(lambda x:x.find_element_by_id("#user"))
    # 设置组件值
    ele.send_keys("admin")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    8. 下拉框API

    操作下拉框对应API,用 css 选择器配合 click 也可达到同样效果,使用 Select 则不需要使用 click

    from selenium.webdriver.support.select import Select
    # ele是下拉框对应的标签