画布 1
web自动化测试知识点梳理
  L1 用例录制和编写
    用例录制
      Selenium ide 录制
      导出代码
    Selenium 环境搭建
      准备 python/java 环境
      安装 selenium
        pip install selenium >=4.8
      配置浏览器 driver
        传统设置方式
          下载对应浏览器版本的 driver
          driver 配置到环境变量
          最新版本提供了 driver manager，可以不用手动配置 chrome driver，但是之前配置过的，需要从环境变量中去掉
    浏览器控制
      页面交互操作
        打开浏览器
driver对象声明
          打开的是data;空白页面
          打开Chrome浏览器
            driver = webdriver.Chrome()
            WebDriver driver = new ChromeDriver();
          打开IE浏览器
          打开火狐浏览器
        跳转到具体页面
          driver.get(URL：str)
        退出浏览器
          driver.quit()
        页面的后退
          driver.back()
          river.navigate().back();
        页面的前进
          driver.forward()
          driver.navigate().forward();
        页面刷新
          driver.refresh()
          driver.navigate().refresh();
        窗口最大化
          driver.maximize_window()
          driver.manage().window().maximize();
        窗口最小化
          driver.minimize_window()
          driver.manage().window().minimize();
        设置页面窗口大小
          driver.set_window_size(width 宽度, height 高度)
          driver.manage().window().setSize(new Dimension(width,height));
      获取页面内容
        获取整个页面
          driver.page_source
          driver.getPageSource();
        获取页面标题
          driver.title
          driver.getTitle();
        获取页面的URL
          driver.current_url
          driver.getCurrentUrl();
    控件定位
      八大元素定位
        id
          通过标签的id属性值定位
          driver.find_element(By.ID, "ID属性对应的值")
          driver.findElement(By.id(""));
        name
          通过标签的name属性值定位
          driver.find_element(By.NAME, "Name属性对应的值")
          driver.findElement(By.name(""));
        class_name
          通过标签的class属性值定位
            driver.find_element(By.CLASS_NAME, "Class属性对应的值")
            driver.findElement(By.className(""));
          一般会定位到多个元素，多个元素组成列表使用下标找到具体元素
            driver.find_elements(By.CLASS_NAME, "Class属性对应的值")
            driver.findElements(By.className(""));
        tag_name
          标签的元素定位 <div> <a> <p>
          driver.find_elements(By.TAG_NAME, "标签名称")
          driver.findElement(By.tagName(""));
        a标签元素文本定位
          link_text：a标签中所有的文本定位
            driver.find_element(By.LINK_TEXT, "完整文本")
            driver.findElement(By.linkText(""));
          partial_link_text：a标签中部分文本定位
            driver.find_element(By.PARTIAL_LINK_TEXT, "部分文本")
            driver.findElement(By.partialLinkText(""));
        css
          绝对定位
          driver.find_element(By.CSS_SELECTOR, "css表达式")
          driver.findElement(By.cssSelector(""));
        xpath
          绝对定位
          driver.find_element(By.XPATH, "xpath表达式")
          driver.findElement(By.xpath(""));
    控件交互
      元素查找
        查找单个元素
          ele = driver.find_element(By.元素定位方式, 元素定位表达式)
          driver.findElement(By.元素定位方式(元素定位表达式));
        查找元素列表
          eles = driver.find_elements(By.元素定位方式, 元素定位表达式)
          driver.findElements(By.元素定位方式(元素定位表达式));
      元素操作
        点击
          ele.click()
        清空
          ele.clear()
        输入
          ele.send_keys(输入内容)
          ele.sendKeys(输入内容);
      元素获取
        获取元素文本
          ele.text
          ele.getText();
    等待方式
      强制等待
        强制等待，线程休眠一定时间
        time.sleep(秒数)
        sleep(秒数);
      隐式等待
        声明一次，当前 driver 全局生效
        设置一个等待时间，轮询查找（默认0.5秒）元素是否出现，超出设定时间如果没出现就抛出异常
        driver.implicitly_wait(秒数)
        driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(秒数));
      显式等待
        解决特定条件下的等待问题，比如点击等交互性行为
        WebDriverWait(driver 实例, 最长等待时间 s, 轮询时间 s).until(结束条件函数)
        new WebDriverWait(driver,最长等待时间 s, 轮询时间 s).until(结束条件函数);
        结束条件判断条件
          元素可被定位 visibility_of_element_located
            expected_conditions.visibility_of_element_located((By.CLASS_NAME, 'show-advanced-search'))
            ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#success_btn"))
          元素可被点击 element_to_be_clickable
            expected_conditions.element_to_be_clickable((By.CLASS_NAME, "search-link"))
            ExpectedConditions.elementToBeClickable(By.cssSelector("#success_btn"))
  L2 元素定位于显式等待
    高级定位 css
      css 选择器
        根据元素标签定位
          tag名称
        根据id定位
          #id属性值
        根据class定位
          .class属性值
        根据标签属性定位
          [属性=属性值]
      css 表达式调试方法
        浏览器开发者工具：Console 面板
          $("css表达式")
          $$("css表达式")
      父子关系定位
        父亲css表达式 > 儿子css表达式
      后代关系定位
        祖父css表达式 后代css表达式
      父子关系+顺序
        父亲css表达式 > 儿子css表达式:nth-child(n)
        获取父亲元素对应的儿子元素中的第n个，n序号从1开始
    高级定位 xpath
      xpath 表达式调试方式
        浏览器开发者工具：Console 面板
          $x("xpath表达式")
        浏览器开发者工具：Elements 面板
          ctrl+f
            输入xpath表达式
      相对定位
        /
          从该节点的子元素选取
        //
          从该节点的子孙元素选取
            //
        *
          通配符
        nodename
          选取此节点的所有子节点
        @
          选取属性
        ..
          选取当前节点的父节点
      顺序关系
        nodename[index]
        通过索引 index 来获取节点，索引从 1 开始
      高级用法
        [@属性名='属性值' and @属性名='属性值']
          取并集
        [@属性名='属性值' or @属性名='属性值']
          取交集
        [text()='文本信息']
          标签中的文本值定位
        [contains(text(),'文本信息')]
          根据文本信息包含定位
        [last()]
          选取最后一个
    显式等待高级使用
      判断元素是否可点击
        element_to_be_clickable()
        elementToBeClickable();
      判断元素是否存在且可见
        visibility_of_element_located()
        visibilityOfElementLocated();
      判断当前页面URL是否包含指定的字符串
        url_contains()
        urlContains();
      判断当前页面标题是否与指定的字符串完全匹配
        title_is()
        titleIs();
      判断指定的frame是否可用并切换到它
        frame_to_be_available_and_switch_to_it()
        frameToBeAvailableAndSwitchToIt();
      判断是否存在弹窗
        alert_is_present()
        alertIsPresent();
    网页 frame 与多窗口处理
      窗口切换
        通过窗口句柄 handle 标记每个页签
        获取当前浏览器所有的句柄
          driver.window_handles
          driver.getWindowHandles();
        获取当前窗口的句柄
          driver.current_window_handle
          driver.getWindowHandle();
        切换句柄
          driver.switch_to.window(handle)
          driver.switchTo().window(handle);
      frame 切换
        定位iframe元素
          iframe_ele = driver.find_element(By.CSS_SELECTOR, 'iframe.iframe')
          WebElement iframeEle = driver.findElement(By.cssSelector("iframe.iframe"));
        切换到指定frame
          driver.switch_to.frame(iframe_ele)
          driver.switchTo().frame(iframeEle);
    高级控件交互方法
      鼠标操作
        双击元素
          double_click(clickable)
          doubleClick(clickable);
        右键点击元素
          context_click(clickable)
          contextClick(clickable);
        鼠标悬停
          move_to_element(hoverable)
          moveToElement(hoverable);
        鼠标拖拽
          drag_and_drop(Aele, Bele)
          dragAndDrop(Aele,Bele);
      键盘操作
        键盘输入
          send_keys(text)
          sendKeys(text);
        按下键位
          key_down()
          keyDown();
        松开键位
          key_up()
          keyUp();
        组合键
          key_down()+ key_up()
          keyDown()+keyUp()
    文件上传弹框处理
      文件上传
        定位 input 标签
        send_keys(指定要上传的文件路径)
        sendKeys(指定要上传的文件路径);
      弹窗处理
        获取当前页面上的警告框
          alert_ele = switch_to.alert
          driver.switchTo().alert();
        返回文本信息
          alert.text
          getText()
        接受现有警告框，即点击确定
          alert.accept()
        解散现有警告框，即点击取消
          alert.dismiss()
        发送文本至警告框
          alert.send_keys(text)
          alert.sendKeys(text);
    自动化关键数据记录
      日志
        logging
        slf4j+日志实现
      步骤截图
        driver.save_screenshot(png_path)
        ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
      页面源码
        driver.page_source
        driver.getPageSource();
  L3 验证码处理与 PO 设计模式
    浏览器复用
      退出当前所有的谷歌浏览器
      找到 chrome 的启动路径
      配置环境变量
      验证是否启动成功
        windows
          chrome --remote-debugging-port=9222
        mac
          Google\ Chrome --remote-debugging-port=9222
      代码设置
        from selenium.webdriver.chrome.options import Options
option = Options()
option.debugger_address = "localhost:9222"
driver = webdriver.Chrome(options=option)
driver.get(url)
        // 设置chromeOptions实例对象
ChromeOptions chromeOptions = new ChromeOptions();
// 配置debug地址
chromeOptions.setExperimentalOption("debuggerAddress","localhost:9222");
// 初始化浏览器并添加配置信息
WebDriver driver = new ChromeDriver(chromeOptions);
driver.get("https://baidu.com/");
    Cookie复用
      保存 cookie
        访问登录页面
          driver.get(url)
        登陆成功后，获取登陆 cookies
          driver.get_cookies()
          driver.manage().getCookies();
        将 cookie 写入文件
          with open("cookie.yaml", "w") as f:
yaml.safe_dump(cookie, f)
          new ObjectMapper(new YAMLFactory()).writeValue(new File("cookies.yaml"), cookies);
      使用 cookie 登录
        进入登录页面
        从文件中获取 cookie 信息登陆
          with open("cookie.yaml", "r", encoding="utf-8") as f:
cookies = yaml.safe_load(f)
          new ObjectMapper(new YAMLFactory()).writeValue(new File("cookies.yaml"), cookies);
        添加 cookie
          driver.add_cookie(cookie)
          driver.manage().addCookie();
    PO 设计模式
    异常自动截图
  L4 多浏览器自动化测试方案
    selenium 多浏览器处理
    执行 javascript 脚本
    无头浏览器使用
  L5 Playwright 与 Cypress
    cypress 测试框架介绍
    playwright 测试框架介绍