首页 文章 精选 留言 我的

精选列表

搜索[诊断自动化],共10000篇文章
优秀的个人博客,低调大师

Apache Ant 1.10.12 发布,自动化构建工具

Apache Ant 1.10.12 已发布。 目前 Apache Ant 团队正在维护两个分支,分别是 1.9.x 和 1.10.x。前者要求 Java 5 以上,后者要求 Java 8 以上。1.9.x 系列主要是修复 bug,1.10.x 会增加新功能,两个分支都基于 Ant 1.9.7。除非在构建过程中要求 Java 8 之前的版本,否则最好还是使用官方推荐的 1.10.x 分支。 此次发布的 1.10.12 主要是修复 bug。 已修复的错误 即便"followRedirects"属性被设置为"false",http condition 也会跟随重定向。此问题现已修复。 确保将 build.compiler 设置为与 extJavac 或现代相对应的完全限定类名,与使用较短的别名具有相同的效果 防止 org.apache.tools.ant.IntrospectionHelper 中的潜在死锁 其他变更 修改 AntClassLoader#findResources() 方法的实现,优化其潜在的性能问题。详情点此查看 AntClassLoader 已实现 ClassLoader#findResource(String) 方法 Ant 在可能的情况下会尽量避免文件名的规范化 (file name canonicalization) 当"failonwarning"设置为 true 时,javadoc task 会在 STDERR stream 中寻找警告信息 tar task 现已支持保留嵌套 tarfilesets 的符号链接 下载地址 https://ant.apache.org/bindownload.cgi(二进制文件) https://ant.apache.org/srcdownload.cgi(源代码)

优秀的个人博客,低调大师

python pip之python模块自动化安装脚本

此脚本集成pip所有功能,可在远程环境中执行,为你解决还在忧愁记住pip命令烦恼,此脚本预留了接口,可根据自己的实际环境自定义开发。 defpip_python_file(): win=(sys.platform=='win32') linux=(sys.platform=='linux2') ifwin: version=subprocess.Popen('pip-V',stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() iflen(version)>0: print('********************安装环境信息********************') try: print('win_version:') print('\t'+u'版本:%s'%platform.platform()) exceptException: print() pip_version=subprocess.Popen('pip-V', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).stdout.readlines() python_version=subprocess.Popen('python-V', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).stdout.readlines() python_path=subprocess.Popen('wherepython', stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True).stdout.readlines() forpython_version1inpython_version: print('python_version&path:') print('\t'+u'版本:%s'%str(python_version1,encoding="utf8").strip()) forpython_path1inpython_path: print('\t'+u'路径:%s'%str(python_path1,encoding="utf8").strip()) forpip_version1inpip_version: print('pip_version&path:') print('\t'+u'版本:%s'%str(pip_version1,encoding="utf8").strip()[:11]) print('\t'+u'路径:%s'%str(pip_version1,encoding="utf8").strip()[16:]) defmenu(): print("****************Pythonpip安装工具1.0****************") print('1.添加py模块') print('2.卸载py模块') print('3.查询更新py模块') print('4.查询单个py模块') print('5.查询所有py模块') print('6.pip使用方法') print('7.更新py模块') print('8.退出pip工具') print('9.查看本电脑环境变量') definput_card(): """ 1.添加py模块 :return: """ try: print('***************添加py模块***************') out=input('输入模块名称:') add_pip="pipinstall" add_pip1=subprocess.Popen(add_pip+'\t'+out,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() foriinadd_pip1: print('\t'+str(i,encoding="utf8").strip()) exceptExceptionase: print("错误日志:"+str(e)) else: print() whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() defdel_name(): """ 2.卸载py模块 :paramcard_list: :return: """ try: print('***************卸载py模块***************') out=input('输入卸载模块名称:') add_pip="pipuninstall" add_pip1=subprocess.Popen(add_pip+'\t'+out,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() foriinadd_pip1: print('\t'+str(i,encoding="utf8").strip()) exceptExceptionase: print("错误日志:"+str(e)) else: print() whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() defdel_card(): """ 7.更新py模块 :return: """ try: print('***************更新py模块***************') out=input('输入需要更新模块名:') add_pip="pipinstall-U" add_pip1=subprocess.Popen(add_pip+'\t'+out,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() foriinadd_pip1: print('\t'+str(i,encoding="utf8").strip()) exceptExceptionase: print("错误日志:"+str(e)) else: print() whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() deffind_name(): """ 4.查询已安装模块 :paramcard_list: :return: """ t=input('输入查询模块名称:') importsys defdump(module): print("{0}模块安装路径".format(module)) ifmoduleinsys.builtin_module_names:#查找内建模块是否存在 print("") else: module=__import__(module)#非内建模块输出模块路径 print('(非内置模块已安装)安装路径:%s'%module.__file__) dump(t) whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() defedit_name(): """ 3.需要升级模块 :paramcard_list: :return: """ update_pip="piplist--outdated" update_pip1=subprocess.Popen(update_pip,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() print(u'需要升级模块:') foriinupdate_pip1: print('\t'+str(i,encoding="utf8").strip()) whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() defsee_card(): """ 5.查看所有安装py模块 :paramcard_list: :return: """ cat_pip="piplist" cat_pip1=subprocess.Popen(cat_pip,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() print(u'你已安装的模块:') foriincat_pip1: print('\t'+str(i,encoding="utf8").strip()) whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() defpip_help(): """ 6.退出系统 :return: """ sys.exit('感谢使用本工具!!!') defsign_out(): """ 8.pip参数使用方法 :paramcard_list: :return: """ update_pip="pip" update_pip1=subprocess.Popen(update_pip,stdout=subprocess.PIPE,stderr=subprocess.PIPE, shell=True).stdout.readlines() print(u'pip参数使用方法:') foriinupdate_pip1: print('\t'+str(i,encoding="utf8").strip()) whileTrue: niu=input("请继续您的选择是(y/q):").strip() ifniu=='y': returnmain() elifniu=='q': exit('/n你已退出程序...') else: print("输入错误,请重新输入") returnmain() defpip_path(): importos print(u'本地电脑环境变量:') print('\t'+'PATH='+os.environ['path']) defmain(): menu() whileTrue: mun=input('请输入功能序号:') ifmun.isdigit(): mun=int(mun) else: print('请输入正确的功能序号!') ifmun==1: input_card() ifmun==2: del_name() ifmun==3: edit_name() ifmun==4: find_name() ifmun==5: see_card() ifmun==6: sign_out() break ifmun==7: del_card() ifmun==8: pip_help() ifmun==9: pip_path() if__name__=='__main__': card_list=[] main() else: print('请先安装pip或配置环境变量') else: print('请先安装pip或配置环境变量') frombs4importBeautifulSoup text=""" pip安装方法""" soup=BeautifulSoup(text,'html.parser') href=soup.find('a').get('href') print('pip安装方式:',href) iflinux: pass else: print('请先安装pip或配置环境变量')

优秀的个人博客,低调大师

Java自动化测试(Android app界面元素 33)

App分类 Native App 原生App 优点 直接依托于操作系统,交互性最强,性能最好,功能最为强大 缺点 开发成本高,更新缓慢,审核周期慢,维护成本高 Hybrid App 混合型App 优点 开发成本较低,可以跨平台,调试方便,维护成本低,功能可复用,性能和体验要比web app好,更新较自由 缺点 相比原生性能仍有较大损耗,不适用于交互性较强的app Web App 使用浏览器展示 优点 开发成本低,可以跨平台,调试方便,更新无需通知用户,不需要手动升级,无需安装App,不会占用手机存储空间 缺点 无法获取系统级别的通知/提醒/动效等,用户留存率低,体验差,设计受限较多 如何区分 开启显示布局界面,当看到出现方框则使用的是原生 定位 ActivityName & PackageName PackageName「包名」 应用的唯一身份标示,系统通过包名识别不同的应用,如两个相同包名的应用在安装时会提示覆盖 ActivityName「类名」 Activity:android四大组件之一,就是一个和用户交互的界面 $adbshelldumpsysactivity|grep"mFocusedActivity"#Android8以上$adbshelldumpsysactivity|grep"mResumedActivity" 查找当前Activity 启动入口appActivity和Activity的区别: appActivity在App中是唯一的,它的作用是用来启动app的 $aaptdumpbadgingD:\apk\base.apk|find"launchable-activity" App页面布局 布局类型 框架布局 所有控件都被放置在左上的区域 下一个子控件会重叠覆盖上一个控件 线性布局 控件的排序方式:垂直/水平 绝对布局 采用坐标轴的方式定位控件 左上角(0,0) 往右x+ 往下y+ 相对布局 根据参照物的位置,来确定控件的位置 表格布局 通过表格的行列布局控件位置 元素定位 打开uiautomatorviewer $cd/Users/zhongxin/Library/Android/sdk/tools/bin$shuiautomatorviewer uiautomatorviewer id定位 resource-id定位,App是允许「resource-id」相同,如果有相同的resource-id,那么获取第一个元素 androidDriver.findElement(MobileBy.id("com.lemon.lemonban:id/category_title")).click(); text定位 androidDriver.findElement(MobileBy.AndroidUIAutomator("newUiSelector().text(\"全程班\")")).click(); className定位 类似web tagName找到元素类型 androidDriver.findElement(MobileBy.className("android.widget.TextView")).click(); Xpath定位 androidDriver.findElement(MobileBy.xpath("//android.widget.TextView[@text='全程班']")).click();androidDriver.findElement(MobileBy.xpath("//android.widget.FrameLayout[@resource-id='com.lemon.lemonban:id/navigation_tiku']")).click(); 坐标定位 TouchActiontouchAction=newTouchAction(androidDriver);PointOptionpointOption=PointOption.point(445,1539);touchAction.press(pointOption).release().perform(); toast元素定位 Toast是一种简单的消息提示框。当视图显示给用户,在应用程序中显示为浮动。和Dialog不一样的是,它永远不会获得焦点,无法被点击。 获取方式1:隐式等待 androidDriver.manage().timeouts().implicitlyWait(8,TimeUnit.SECONDS);androidDriver.findElement(MobileBy.xpath("//*[contains(@text,'错误的账号信息')]")); 获取方式2:显式等待 WebDriverWaitwait=newWebDriverWait(androidDriver,5);WebElementelement=wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.xpath("//*[contains(@text,'错误的账号信息')]")));element.getText(); 使用Appium定位 1.填写连接信息 填写连接信息 2. 启动会话 Appium 调试代码 packagecom.zhongxin.day03;importio.appium.java_client.MobileBy;importio.appium.java_client.TouchAction;importio.appium.java_client.android.AndroidDriver;importio.appium.java_client.touch.offset.PointOption;importorg.apache.tools.ant.taskdefs.Touch;importorg.aspectj.apache.bcel.ExceptionConstants;importorg.openqa.selenium.WebDriver;importorg.openqa.selenium.WebElement;importorg.openqa.selenium.remote.DesiredCapabilities;importorg.openqa.selenium.support.ui.ExpectedConditions;importorg.openqa.selenium.support.ui.WebDriverWait;importorg.testng.annotations.AfterTest;importorg.testng.annotations.BeforeTest;importorg.testng.annotations.Test;importjava.net.MalformedURLException;importjava.net.URL;importjava.util.concurrent.TimeUnit;publicclassElementLocator{privateAndroidDriverandroidDriver;@BeforeTestpublicvoidsetUp()throwsMalformedURLException{DesiredCapabilitiescapabilities=newDesiredCapabilities();capabilities.setCapability("platformName","Android");capabilities.setCapability("deviceName","127.0.0.1:62001");capabilities.setCapability("appPackage","com.lemon.lemonban");capabilities.setCapability("appActivity","com.lemon.lemonban.activity.WelcomeActivity");URLurl=newURL("http://127.0.0.1:4723/wd/hub");androidDriver=newAndroidDriver(url,capabilities);androidDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);}@Testpublicvoidtest01(){//androidDriver.findElement(MobileBy.id("com.lemon.lemonban:id/category_title")).click();//androidDriver.findElement(MobileBy.AndroidUIAutomator("newUiSelector().text(\"全程班\")")).click();//androidDriver.findElement(MobileBy.className("android.widget.TextView")).click();//androidDriver.findElement(MobileBy.xpath("//android.widget.TextView[@text='全程班']")).click();//androidDriver.findElement(MobileBy.xpath("//android.widget.FrameLayout[@resource-id='com.lemon.lemonban:id/navigation_tiku']")).click();//TouchActiontouchAction=newTouchAction(androidDriver);//PointOptionpointOption=PointOption.point(445,1539);//touchAction.press(pointOption).release().perform();androidDriver.manage().timeouts().implicitlyWait(8,TimeUnit.SECONDS);androidDriver.findElement(MobileBy.xpath("//*[contains(@text,'错误的账号信息')]"));WebDriverWaitwait=newWebDriverWait(androidDriver,5);WebElementelement=wait.until(ExpectedConditions.presenceOfElementLocated(MobileBy.xpath("//*[contains(@text,'错误的账号信息')]")));Stringtext=element.getText();System.out.println(text);}@AfterTestpublicvoidtearDown()throwsInterruptedException{Thread.sleep(2000);androidDriver.quit();}} 本文分享自微信公众号 - 测试游记(zx94_11)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册