android 富文本框架_史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(二)

2023-11-18

本文为霍格沃兹测试学院学员学习笔记,进阶学习文末加群。

本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中,所涉及到的方方面面的知识点精华内容(如下所示),希望对大家快速总结和复习有所帮助。

Appium 自动化测试从基础到框架实战
  1. Appium 基础 1 (环境搭建和简介)
  2. Appium 基础 2 (元素定位和元素常用方法)
  3. Appium 基础 3 (手势操作和 uiautomator 查找元素)
  4. Appium 基础 4 (显式等待)
  5. Appium 基础 5 (toast 和参数化)
  6. Appium 基础 6 (webview)
  7. Appium_ 企业微信练习 (非 PO,增加和删除联系人)
  8. Appium_ 企业微信练习 ( PO--增加联系人)

本文为第二篇,主要讲解 Appium 手势操作、查找元素、显示等待(附实例代码)。

Appium 的触屏操作

滑动小案例
  1. 进入雪球应用
  2. 再主页从下往上滑动
  3. 避免使用坐标(代码用获取屏幕的长宽来解决这个问题)
代码
from time import sleepfrom appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionclass TestFind():    def setup(self):        self.desire_cap= {            "platformName":"android",            "deviceName":"127.0.0.1:7555",            "appPackage":"com.xueqiu.android",            "appActivity":".view.WelcomeActivityAlias",            "noReset":"true",            "unicodeKeyboard":True        }        self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)        self.driver.implicitly_wait(5)    def test_search(self):        """        1.进入雪球应用        2.再主页从下往上滑动        3.避免使用坐标        :return:        """        #由于雪球真的是太慢了,所以睡10秒        sleep(10)        #定义一个TouchAcion对象        aciton=TouchAction(self.driver)        #获取整个屏幕的右下角的坐标        window_rect=self.driver.get_window_rect()        #提取屏幕的最大的宽        width=window_rect["width"]        #提取屏幕的最大的高度        height=window_rect['height']        #x的坐标定义为最大宽的一半,也就是中心的x坐标        x1=int(width/2)        #定义起始的y坐标,在4/5的底部位置        y_start=int(height* 4/5)        #定义终点的y坐标,在1/5顶部的位置,这样就可以模拟从下往上滑动的动作        y_end=int(height* 1/5)        #先press点击初始的坐标,然后按住不放等2秒再move_to到终点坐标,然后再release()释放坐标点,用perform()去执行一系列action操作        aciton.press(x=x1,y=y_start).wait(2000).move_to(x=x1,y=y_end).release().perform()        #重复两次,看的效果更明显        aciton.press(x=x1, y=y_start).wait(2000).move_to(x=x1, y=y_end).release().perform()        aciton.press(x=x1, y=y_start).wait(2000).move_to(x=x1, y=y_end).release().perform()        sleep(3)
滑动多点解锁
  1. 得下载一个叫手势密码锁的 App,百度一下有
  2. 进入解锁的页面
  3. 设置解锁密码为一个7字
  4. 意外发现 Appium 可以指定去不同的初始的 activity,好像也是看应用的
代码
from time import sleepfrom appium import webdriverfrom appium.webdriver.common.mobileby import MobileBy as Byfrom appium.webdriver.common.touch_action import TouchActionclass TestFind():    def setup(self):        self.desire_cap = {            "platformName": "android",            "deviceName": "127.0.0.1:7555",            "appPackage": "cn.kmob.screenfingermovelock",            "appActivity": "com.samsung.ui.MainActivity",            "noReset": "true"        }        self.driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", self.desire_cap)        self.driver.implicitly_wait(5)    def test_search(self):        """        1.进入解锁的页面        2.设置解锁密码为一个7字        3.意外发现appium可以指定去不同的初始的activity,好像也是看应用的        :return:        """        sleep(3)        #定义一个TouchAcion对象        aciton=TouchAction(self.driver)        #找到7个坐标点,通过连续的press,wait,move_to,最后释放手势release(),然后perform()执行即可        aciton.press(x=142,y=190).wait(200).move_to(x=408,y=190).wait(200).move_to(x=678,y=190).wait(200).move_to(x=678,y=464)         .wait(200).move_to(x=678,y=740).release().perform()        sleep(2)

UIAutomator 查找元素

优缺点
  • 优点
    • xpath 定位速度慢
    • UIAutomator 是 Android 的工作引擎,速度快
    • 滚动查找很方便
  • 缺点
    • 表达式书写复杂,容易写错 IDE 没有提示
定位方式
  • 通过 resource-id 定位
  • 通过 classname 定位
  • 通过 content-desc 定位
  • 通过文本定位
  • 组合定位
  • 通过父子关系定位
用法
  • driver.find_element_by_android_uiautomator("表达式")
  • 注:外层要用单引号,内层的字符串用双引号,因为本来就是 Java,Java 双引号才表示字符串
  • 通过文本定位
    • new UiSelector().text("text文本")
  • 通过 textContains 模糊匹配
    • new UiSelector().textContains("text文本")
  • 通过某个文本开头匹配
    • new UiSelector().textStartWith("text文本")
  • 正则表达式匹配
    • new UiSelector().textMatches("text文本")
  • 组合定位
    • 比如 id 与 text 的属性组合:driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_account").text("我的")')
  • 父子关系定位:childSelector,先定位到父类,再用 childSelector 来定位子类
    • driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_account").childSelector(text("股票"))')
  • 兄弟定位:fromParent
    • driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_account").fromParent(text("股票"))')
代码
from time import sleepfrom appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionclass TestFind():    def setup(self):        self.desire_cap= {            "platformName":"android",            "deviceName":"127.0.0.1:7555",            "appPackage":"com.xueqiu.android",            "appActivity":".view.WelcomeActivityAlias",            "noReset":"true",            "unicodeKeyboard":True        }        self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)        self.driver.implicitly_wait(5)    def test_search(self):        """        1.打开雪球app        2.点击我的,进入到个人信息页面        3.点击登录,进入到登录页面        4.输入用户名,输入密码        5.点击登录        6.弹出手机号输入失败的提示,并assert这个提示对不对        :return:        """        #雪球太慢了,只能10秒了,懒得用显示等等        sleep(10)        #在首页找到我的元素,然后点击        self.driver.find_element_by_android_uiautomator('new UiSelector().text("我的")').click()        #不睡2秒回导致下一个页面的元素刷新太快识别不到        sleep(2)        #识别账号密码登录的元素,然后点击        self.driver.find_element_by_android_uiautomator('new UiSelector().text("帐号密码登录")').click()        #不睡2秒回导致下一个页面的元素刷新太快识别不到        sleep(2)        #输入账号名为tongtong        self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_account")').send_keys("tongtong")        #输入密码为tongtong        self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_password")').send_keys("tongtong")        #不睡2秒回导致下一个页面的元素刷新太快识别不到        sleep(2)        #点击登录按钮        self.driver.find_element_by_android_uiautomator('new UiSelector().text("登录")').click()        #不睡2秒回导致下一个页面的元素刷新太快识别不到        sleep(2)        #找到错误提示框,里面有一个确定的元素        login_incorrect=self.driver.find_element_by_android_uiautomator('new UiSelector().text("确定")')        #当确定的元素可见,表示登录失败,用例pass        assert login_incorrect.is_displayed()
滑动元素查找
  • 有一些页面有持续滑动的能力,比如微博,没有分页,可以一直滑动,UIAutomator 提供了滑动的很好的方法。
  • driver.find_element_by_android_uiautomator(‘new UiScrollable(new UiSelector().’‘scrollable(true).instance(0)).’‘scrollIntoView(new UiSelector().textContains(“病人”).’‘instance(0));’).click()
  • 注意:虚拟机和真机不一样,有时候真机的滑动是ok的,有时候虚拟机的不ok
代码
from time import sleepfrom appium import webdriverfrom appium.webdriver.common.touch_action import TouchActionclass TestFind():    def setup(self):        self.desire_cap= {            "platformName":"android",            "deviceName":"127.0.0.1:7555",            "appPackage":"com.xueqiu.android",            "appActivity":".view.WelcomeActivityAlias",            "noReset":"true",            "unicodeKeyboard":True        }        self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)        self.driver.implicitly_wait(5)    def test_search(self):        """        0.你的雪球app先关注一个人,然后往下滑,找到一个关键字,用textContains来模糊匹配        1.打开雪球app        2.点击关注,让屏幕往下滑,直到找到病人的模糊匹配的text元素后点击        :return:        """        #雪球太慢了,只能10秒了,懒得用显示等等        sleep(10)        #点击关注的元素        self.driver.find_element_by_android_uiautomator('new UiSelector().text("关注")').click()        #睡4秒,怕跳转页面太快,搜索不到元素        sleep(4)        self.driver.find_element_by_android_uiautomator('new UiScrollable(new UiSelector().'                                                        'scrollable(true).instance(0)).'                                                        'scrollIntoView(new UiSelector().textContains("病人").'                                                        'instance(0));').click()        sleep(4)

强制等待、隐式等待、显示等待

三者的特点
  • 强制等待是 sleep,强烈不推荐,设定的时间太固定,如果是模拟器等待3秒,真机可能只需要等待2秒
  • driver.implicitly.wat(timeout),贯穿全部元素的等待,只需要设定一次即可,通常是在创建 driver 的时候后的代码运行,是 dom 建立之后的等待;
  • 显示等待是在客户端的等待:引用两个包和一个例子
    • from selenium.webdriver.support.wait import WebDriverWait
    • from selenium.webdriver.support import expected_conditions
    • WebDriverWait(self.driver,10).until(expected_conditions.element_to_be_clickable(locator))
显示等待的简介
  • 显示等待与隐式等待相对,显示等待必须在每一个需要等待的元素前面进行声明
  • 是针对某个特定的元素设置等待时间,在设置时间内,默认美格一段时间检测一次当前某个元素是否存在
  • 如果在规定的时间内找到元素,则直接执行,即找到元素就执行相关操作
  • 如果超过设置时间检测不到就抛出异常,默认检测频率为0.5s,默认抛出的异常时NoSuchElementException
  • 用到的两个常用类
    • WebDriverWait
    • expected_condition
为什么要用显示等待,为什么隐式等待无法替代显示等待?
  • 显示等待可以等待动态加载的 AJax 元素,需要配合 expected_condition 来检查条件
  • 一般页面上元素的呈现顺序是
    • 首先出现 title;
    • 然后是 dom 树的出现,presence 还不完整,dom 树出现就是隐式等待了,但此时的元素可能还没有是可点击的状态,所以只用隐式等待,使用 click 方法,肯定会报错的;
    • CSS 出现:可见 visbility;
    • JS 的出现,JS 特效执行:可点击 clickable;
  • HTML 文档是自上而下加载的
  • JS 文件加载会阻塞 HTML 内容的加载,有些 JS 异步加载的方式来完成 JS 的加载
  • 样式表下载完成之后跟之前的样式表一起进行解析,会对之前那的与元素重新渲染
  • presence-visibility-clickabe,元素出现-可见-可点击,是元素的三个性质,当 DOM 树出现时,定位元素可能已经显示出来了,但是可见和可点击的属性可能还没加载出来,这时候元素的一些方法是不可用的,比如 element.click(),要等到 JS 渲染出来以后,元素的 click 属性才可以用
    • 对应element.is_displayed()
    • 对应element.is_selected()
    • 对应element.is_enabled()
JS 的同步加载和异步加载
  • 同步加载:同步模式,又称阻塞模式,会阻止浏览器的后续处理,停止了后续的解析,因此停止了后续的文件加载(如图像)、渲染、代码执行。
  • 异步加载:异步加载又叫非阻塞,浏览器在下载执行 JS 同时,还会继续进行后续页面的处理。
WebDriverWait 用法
  • WebDriverWait(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
  • driver:浏览器驱动
  • timeout:超时时间,单位秒
  • poll_frequency:检查的间隔步长,默认是0.5s
  • ignored_exceptions:超时最后的抛出的异常,默认是NoSuchElementException
  • 通常我们只会用到 driver 和 timeout
  • WebDriverWait().unti(self, method, message='') or until_not()的方法:
    • method:在等待期间,每个一段时间(init中的poll_frequency)调用这个传入的方法,直到返回值不是 False
    • message:如果超时,抛出 TimeoutException,将 message 传入异常
    • until not 是当某个元素小时或什么条件则继续执行,参数也相同
expected_conditions 类
  • Appium 直接帮我们封装好了类,只需要传参数即可,比如我们使用的是 click(),只需要判断这个元素是否可点击属性才继续点击
  • 用法:expected_conditions.element_to_be_clickable(locator),其中 locator 就是:(By.ID, "com.xueqiu.android:id/tv_search")
  • 常用的几个如下:
  • expected_conditions.element_to_be_clickable:元素是否可点击
  • expected_conditions.presence_of_element_located:元素是否被加到 Dom 树里面
  • expected_conditions.visibility_of_element_located:元素是否可见
Lambda 获取元素
#可以获取到元素element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element(By.XPATH,'//*[@text="我的"]'))#这里找到元素后,不用等待,实测证明过了element.click()
实例代码
from appium import webdriverfrom selenium.webdriver.support import expected_conditionsfrom selenium.webdriver.support.wait import WebDriverWaitfrom appium.webdriver.common.mobileby import MobileBy as Byclass TestFind():    def setup(self):        self.desire_cap= {            "platformName":"android",            "deviceName":"127.0.0.1:7555",            "appPackage":"com.xueqiu.android",            "appActivity":".view.WelcomeActivityAlias",            "noReset":"true",            "unicodeKeyboard":True        }        self.driver=webdriver.Remote("http://127.0.0.1:4723/wd/hub",self.desire_cap)        self.driver.implicitly_wait(5)    def test_search(self):        """        1.打开雪球app        2.点击我的,进入到个人信息页面        3.点击登录,进入到登录页面        4.输入用户名,输入密码        5.点击登录        6.弹出手机号输入失败的提示,并assert这个提示对不对        :return:        """        #By.name方法不是对应text的,千万不要用        #self.driver.find_element(By.NAME,"我的")        #用显示等待,element_to_be_clickable(locator),里面的locator记得用元祖        WebDriverWait(self.driver, 15).until(expected_conditions.element_to_be_clickable((By.XPATH,'//*[@text="我的"]')))        #在首页找到我的元素,然后点击        self.driver.find_element(By.XPATH,'//*[@text="我的"]').click()        '''        lambda返回元素        element = WebDriverWait(self.driver, 10).until(lambda x: x.find_element(By.XPATH,'//*[@text="我的"]'))        这里找到元素后,不用等待,实测证明过了        element.click()        '''        #显示等待找到账号密码登录的元素        WebDriverWait(self.driver, 15).until(expected_conditions.element_to_be_clickable((By.XPATH,'//*[@text="帐号密码登录"]')))        #识别账号密码登录的元素,然后点击        self.driver.find_element_by_android_uiautomator('new UiSelector().text("帐号密码登录")').click()        #显示等待找到账号的元素        WebDriverWait(self.driver, 15).until(            expected_conditions.element_to_be_clickable((By.XPATH, '//*[@resource-id="com.xueqiu.android:id/login_account"]')))        #输入账号名为tongtong        self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_account")').send_keys("tongtong")        #输入密码为tongtong        self.driver.find_element_by_android_uiautomator('new UiSelector().resourceId("com.xueqiu.android:id/login_password")').send_keys("tongtong")        #显示等待找到登录的按钮        WebDriverWait(self.driver, 15).until(            expected_conditions.element_to_be_clickable((By.XPATH, '//*[@text="登录"]')))        #点击登录按钮        self.driver.find_element_by_android_uiautomator('new UiSelector().text("登录")').click()        #显示等待找到确定的元素        WebDriverWait(self.driver, 15).until(            expected_conditions.element_to_be_clickable((By.XPATH, '//*[@text="确定"]')))        #找到错误提示框,里面有一个确定的元素        login_incorrect=self.driver.find_element_by_android_uiautomator('new UiSelector().text("确定")')        #当确定的元素可见,表示登录失败,用例pass        assert login_incorrect.is_displayed()

更多内容,我们在后续文章分享。

(文章来源于霍格沃兹测试学院)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android 富文本框架_史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(二) 的相关文章

  • 图像去模糊:MSSNet 模型详解

    本内容主要介绍实现单图像去模糊的 MSSNet 模型 论文 MSSNet Multi Scale Stage Network for Single Image Deblurring 代码 官方 https github com kky7 M
  • 什么是 DevSecOps?2022 年的定义、流程、框架和最佳实践

    DevSecOps 是一套实用且面向目标的方法 用于确保系统安全 DevSecOps 被定义为通过与 IT 安全团队 软件开发人员和运营团队合作 在标准 DevOps 周期中建立关键安全原则的过程 以下是对 2022 年 DevSecOps
  • 基于单片机的无线数据传输系统设计

    基于单片机的无线数据传输系统设计 类别 电子综合 1 引 言 随着计算机 通信和无线技术的逐步融合 在传统的有线通信的基础上 无线通信技术应运而生 他具有快捷 方便 可移动和安全等优势 所以广泛应用到遥控玩具 汽车电子 环境监测和电气自动化
  • 使用java关键字编写代码

    使用java关键字编写代码 java的关键字 java的基本数据类型 Java是一种强类型语言 必须为每一个变量声明一种类型 Java共包含8中基本类型 其中4种整型 2种浮点型 1种用于表示Unicode编码的字符单元的字符类型char和
  • Oracle VM VirtualBox做好虚拟硬盘后,如何进一步更改虚拟硬盘的大小

    以管理员身份打开 命令提示符窗口 然后利用命令cd进入Oracle VM VirtualBox安装目录 如下图 我进入了Oracle VM VirtualBox安装目录 D Program Files Oracle VirtualBox 然
  • 隐藏此电脑的视频,图片,文档,下载,音乐和3D对象

    此电脑美化 我们平常使用的资源管理器界面 3D 对象 视频 图片这些我们不需要的东西给占据 作为一个有强迫症的人我决定对其进行修改 最终结果如下如所示 网上普遍叫的方法是通过修改注册表文件进行修改 比较好的文章有 Win10删除资源管理器
  • moviepy音视频剪辑:视频半自动追踪人脸打马赛克

    一 引言 在 moviepy1 03音视频剪辑 使用manual tracking和headblur实现追踪人脸打马赛克 介绍了使用手动跟踪跟踪人脸移动轨迹和使用headblur对人脸进行打马赛克 实际上 moviepy除了使用manual
  • windows服务启动失败解决流程

    最近遇到windows服务启动失败的情况 网上查阅了一下相关的解决方式 顺便记录一下解决的一般流程和方式 一般是软件的配置文件出现问题 先检查配置文件是否有问题 例如没有符合yml格式 不可使用tab键而是空格键 等细节问题 1 查看相关应
  • C++const限定符

    最近通过网络资料复习const 后通过跟专业书籍对比 发现网络上很多都存在一些错误 于是在此做个笔记 1 const定义常量 一旦创建后其值就不能再改变 所以其必须初始化 若用表达式初始化 那么会在运行时初始化 若用值初始化 则在编译阶段初
  • 完美解决sqlalchemy.exc.ObjectNotExecutableError: Not an executable object

    报错的程序如下 from sqlalchemy import create engine import pandas as pd engine create engine mysql pymysql root 123456 localhos
  • 双极性正弦脉宽调制(双极性SPWM)介绍及MATLAB仿真验证

    前言 本文介绍单相全桥逆变电路双极性正弦脉冲宽度调制 双极性SPWM 并用MATLAB仿真验证 并且通过对比逆变器滤波前后效果 突出了SPWM谐波高频化 便于滤除的显著特点 希望本文对大家有帮助 文末有仿真模型代码 有需要自取 目录 前言
  • PM2常用命令

    安装pm2 npm install g pm2 1 启动 1 pm2 start app js 2 pm2 start app js name my api my api为PM2进程名称 3 pm2 start app js f name
  • chatgpt赋能python:如何用Python求和

    如何用Python求和 Python是一种高级编程语言 最初设计用于简单的脚本编写 但是也可以用于复杂的科学计算 求和是我们在编程中经常需要处理的基本操作之一 Python具有简单易学的语法和广泛的开源库 使其成为处理数据的强大工具 在本文
  • 2022CISCNmisc

    ez usb 题目已经告诉是usb流量 一共有三个地址2 8 2 10 2 4但2 4没用 我们分别导出2 8和2 10 从网上搜usb脚本将他们两个分别解出来 将那一打穿放到010发现是个rar文件 但是损坏了打不开 可以用winrar修
  • bp神经网络的训练方法,一文搞定bp神经网络

    BP人工神经网络方法 一 方法原理人工神经网络是由大量的类似人脑神经元的简单处理单元广泛地相互连接而成的复杂的网络系统 理论和实践表明 在信息处理方面 神经网络方法比传统模式识别方法更具有优势 人工神经元是神经网络的基本处理单元 其接收的信
  • -day17 面向对象基础

    第三模块 面向对象 网络 并发编程 此模块包含如下三大部分知识 面向对象 Python中支持两种编程方式来写代码 分别是 函数式编程 面向对象式编程 函数式 定义函数 在函数中实现功能 def func print 一个功能 执行函数 fu
  • mysql高可用分库分表ShardingSphere之Sharding-proxy

    文章目录 一 ShardingSphere 1 1 官网地址说明 1 2 为什么分库分表 二 官网整合说明 1 1 下载sharding proxy 1 2 sharding proxy集成注册中心 1 3 查看配置手册 1 3 1 官网数
  • C++ 快速排序

    快速排序是比较常用的一种排序 平均时间复杂度为O nlogn 最坏的时间复杂度为O n 话不多说 上代码 include
  • [Python人工智能] 三十三.Bert模型 (2)keras-bert库构建Bert模型实现文本分类

    从本专栏开始 作者正式研究Python深度学习 神经网络及人工智能相关知识 前一篇文章开启了新的内容 Bert 首先介绍Keras bert库安装及基础用法 这将为后续文本分类 命名实体识别提供帮助 这篇文章将通过keras bert库构建

随机推荐

  • 【C++】异常

    需要云服务器等云产品来学习Linux的同学可以移步 gt 腾讯云 lt gt 阿里云 lt gt 华为云 lt 官网 轻量型云服务器低至112元 年 新用户首次下单享超低折扣 目录 一 异常 1 C语言处理异常的方式 2 C 处理异常的方式
  • MyBatis 中if 标签 判断字符串不生效

    今天遇到if 标签判断字符串不生效 导致查询结果错误 异常sql 的mapper 文件
  • Ubuntu14.04安装ssh实现远程登陆

    Ubuntu14 04安装ssh实现远程登陆 安装 sudo apt get install y ssh 修改ubuntu的ip地址和PC在同一网段内 配置 sudo gedit etc ssh sshd config 修改成如下设置 重启
  • C++给变量起别名

    以下代码展示给变量a取一个别名b 两者指向同一个内存空间位置 改变b a也会相应改变 include
  • AR模型脱卡,unity端实现步骤详情

    AR模型脱卡unity端实现具体步骤 AR模型脱卡的原理 利用一些unity端AR插件做AR应用 通常会有一个需求 当识别物消失的时候 将3D模型从识别物这个父物体上移除 显示在屏幕中央 那么原理就显而易见了 就是在识别物追踪方法中 写一些
  • Pytorch固定部分参数(只训练部分层)

    参考 https www cnblogs com jiangkejie p 11199847 html 在迁移学习中我们经常会用到预训练模型 并在预训练模型的基础上添加额外层 训练时先将预训练层参数固定 只训练额外添加的部分 完了之后再全部
  • 字节对齐和字节序

    1 字节对齐 1 什么是字节对齐 内存空间是按字节划分 理论上可以从任意起始地址访问任意类型的变量 但实际上在访问特定类型变量是经常在特定的内存地址访问 这就需要各种数据类型按照一定的规则进行排列 而不是一个接一个紧接着排放 简单的讲就是数
  • C++拷贝构造函数—类临时对象的构建与析构

    一 对象的概念 对象的基本概念 我们最开始学习数据类型的时候 我们会学到 int a 10 这种写法 这种写法是数据类型 标识符的形式 标识符来给我们程序运行中需要使用到的内存空间取名字 这个标识符一般指的是变量 而利用常量来对我们向系统申
  • 针对“PL2303HXA自2012已停产,请联系供货商”问题的解决办法

    连接nanopi友善之臂时遇到这种情况 首先尝试更新驱动程序 在更新驱动程序后当时可以正常用putty连接板子 但在第二天又出现了这个问题 其实就是驱动程序太新了 安装旧版驱动程序就可以 查看现在的驱动程序版本 是2021年的 打开设备管理
  • 全网最详细中英文ChatGPT-GPT-4示例文档-语句情绪分类从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.js/curl命令源代码,小白也能学)

    从0到1快速入门语句情绪分类应用场景 Introduce 简介 setting 设置 Prompt 提示 Sample response 回复样本 API request 接口请求 python接口请求示例 node js接口请求示例 cu
  • android从一个应用跳转到另一个应用

    获取launcher中的应用列表 Intent intent new Intent intent setAction Intent ACTION MAIN intent addCategory Intent CATEGORY LAUNCHE
  • 奇异谱分解轴承故障诊断代码编写

    答 我可以为您提供一些建议 以帮助您编写奇异谱分解轴承故障诊断代码 1 首先 要确定故障类型 以便确定诊断策略 2 然后 可以使用多种故障诊断技术 包括奇异谱分析 以及其他故障诊断技术 3 为了更好地掌握故障特征 可以使用相关的轴承数据库
  • 最近在学动态规划,很有意思的算法(1)拿金币

    问题描述 有一个N x N的方格 每一个格子都有一些金币 只要站在格子里就能拿到里面的金币 你站在最左上角的格子里 每次可以从一个格子走到它右边或下边的格子里 请问如何走才能拿到最多的金币 输入格式 第一行输入一个正整数n 以下n行描述该方
  • 代码扫描工具对比

    1 概述 随着网络的飞速发展 各种网络应用不断成熟 各种开发技术层出不穷 上网已经成为人们日常生活中的一个重要组成部分 在享受互联网带来的各种方便之处的同时 安全问题也变得越来越重要 黑客 病毒 木马等不断攻击着各种网站 如何保证网站的安全
  • asm:常见指令大全

    常见指令大全 算数指令 INC 指令 DEC 指令 ADD 指令 SUB指令 MUL指令 IMUL指令 DIV指令 IDIV指令 逻辑指令 AND指令 OR指令 XOR 指令 TEST指令 NOT指令 交换指令 xchg 比较指令 CMP指
  • MySQL(二)——基本操作

    MySQL操作 数据库操作 创建数据库 列出 MySQL数据库列表 使用数据库 判断当前所处的数据库 删除数据库 数据库表操作 数据库中的所有表 创建数据表 查询表结构 查询指定表的建表语句 修改表名 删除表单 删除该表并重新再创建 格式化
  • VUE锚点跳转增加滑动效果

    首先我通过直接的锚点跳转是实现不了滑动效果 所以首先实现锚点的跳转效果 先给点击的地方 设置一个点击事件 a 跳转 a 然后是被跳转的地方添加 class industry
  • 只需6行代码教你使用Spire.Doc在Java中将 Word 转为 Tiff

    Spire Doc for Java 是一款专业的Java Word组件 开发人员使用它可以轻松地将Word文档创建 读取 编辑 转换和打印等功能集成到自己的Java应用程序中 本文介绍如何使用Spire Doc for Java将Word
  • linux:ubuntu命令行扩容

    参考 ubuntu 20 04 逻辑卷 ext4 文件系统扩容 mob604757006a49的技术博客 51CTO博客 总结 准备步骤 链接里没有说明 我参考了其他的帖子增加的一步 1 关闭虚拟机 右键虚拟机 选择 设置 2 在虚拟机设置
  • android 富文本框架_史上最全 Appium 自动化测试从入门到框架实战精华学习笔记(二)

    本文为霍格沃兹测试学院学员学习笔记 进阶学习文末加群 本系列文章汇总了从 Appium 自动化测试从基础到框架高级实战中 所涉及到的方方面面的知识点精华内容 如下所示 希望对大家快速总结和复习有所帮助 Appium 自动化测试从基础到框架实