使用Python+Selenium+Webdriver集成开发
1、Python(脚本语言) 2、SetupTools、Pip工具(安装包管理工具) 3、Selenium包(网页自动化测试) 4、浏览器(IE、Chrome、Firefox) 5、浏览器驱动(IEDriver、ChromeDriver等) 6、Selenium IDE插件 7、Firebug插件(获取元素属性,如id、name、xpath等) 8、HTMLTestRunner.py(生成测试报告) 9、xlrd、xlwt(对配置文件execl表格进行操作)
本文使用的软件情况如下:
1、Python下载
https://pan.baidu.com/s/1boIfCPD 密码:xlhg
2、Python环境变量设置
以下以我的Python安装目录为例:
①依次点击:计算机--邮件--属性,打开如下界面:
②点击“高级系统设置”,再点击“环境变量”,如下:
③在系统变量中找到path,双击打开path,然后再路径的最末尾加入:
Python的路径,要以“;”隔开,即可:
D:\Python27; D:\Python27\Lib; D:\Python27\Scripts;
④验证Python是否安装成功,开始---输入“cmd”,回车打开命令行,输入:Python,看到如下界面就表示Python安装成功。
1、SetupTools下载
https://pan.baidu.com/s/1skPKBq1 密码:5m97
2、SetupTools安装
下载 安装包,解压后在windows命令行中进入其所在目录下,使用:
python setup.py install来完成工具安装。
具体如下:
找到解压后的文件,在空白处,按住“shift”并鼠标右键,如下图,点击“在此处打开命令窗口”,输入:python setup.py install回车安装即可
3、验证是否安装成功
打开命令行,输入easy_install,假如看到下面的提示,说明你安装成功
1、方法一
在安装setuptools后我们可以通过下面的一个命令来安装pip:easy_install pip
2、方法二
下载文件后,pip-x.x.tar.gz文件进行解压,进入windows命令提示下执行setup.py,如:
X:\pip x.x > python setup.py install 没有报错表示安装成功。切换到X :\Python27\Script,目录下输入: X:\Python27\Scripts > easy_install pip 没有报错表示安装成功。
下载路径: https://pan.baidu.com/s/1dEWUEul 密码:dihq
1、方法一
下载selenium x.xx.x ,并解压把整个目录放到X:\Python27\Lib\site-packages目录下,进入 windows命令提示下执行setup.py,如: X:\Python27\Lib\site-packages\selenium-x.xx.x >python setup.py install 没有报错表示安装成功。
2、方法二
直接使用 pip install selenium命令来安装
1、下载
https://pan.baidu.com/s/1slJVq8H 密码:mjad
2、设置浏览器驱动调用
把下载的浏览器驱动放在加入谷歌浏览器的安装目录下,然后进行调用即可,如下:
①复制下载的chromedriver.exe,放在谷歌浏览器安装目录下(在谷歌浏览器快捷菜单上右键,点击属性,就可以打开浏览器的安装目录),如下:
②设置以上目录在环境变量中,在path的最后加入以上路径
"""
Author:NoamaNelson
Date:2019-11-08
Purpose:验证Selenium是否安装成功
Function:打开百度网主页,在搜索栏输入“1234567”
"""
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome() # 打开Chrome浏览器
driver.get("http://www.baidu.com") # 输入百度网址
time.sleep(1)
driver.find_element_by_id("kw").send_keys("1234567") # 输入“1234567”
driver.find_element_by_id("kw").send_keys(Keys.ENTER) # 回车进行搜索
time.sleep(2)
driver.maximize_window() # 最大化当前窗口
time.sleep(2)
driver.set_window_size(640, 480) # 控制浏览器显示尺寸为640*480
time.sleep(2)
driver.quit() # 关闭浏览器
1、脚本录制步骤
①打开火狐浏览器,在地址栏上输入被测网页的URL.
②菜单栏:工具-selenium-ide 打开后,在的selenium-ide地址栏输入相同的URL.
③点击开始录制
④在浏览器中进行相应的操作
⑤点击结束录制,查看并回放Selenium IDE 录制的结果
⑥脚本导出(选择导出需要的语言脚本:Python2 /Unittest/webdiver )
2、IDE录制脚本存在局限和问题
①脚本不稳定,回放经常出错(部分操作捕获不到)
②阅读性差,不知道自动化测试执行了具体哪些操作和实现什么功能。(注释)
③如果web页面中的个别元素发生了变化,所有涉及该元素的脚本需要修改。
④元素的id或部分文字是动态的,即每次执行的脚本都是不同的。(参数化)
⑤缺少对实际结果进行判断的语句。(断言)
作者:小郭学数据源自:快学python学习视频可参见python+opencv3.3视频教学基础入门 今天写的是滤波outline均值滤波中值滤波自定义滤波高斯滤波(模糊)图像基础常识:噪声椒盐噪声(Salt&Pepper):含有随机出现的黑白亮度值。(加了胡椒粉,很形象了)盐=白色,椒=黑色高斯噪声:含有亮度服从高斯或正态分布的噪声。高斯噪声是很多传感器噪声的模型,如摄像机的电子干扰噪声。原图与加了高斯噪声后的图片滤波器线性滤波器线性滤波器的原始数据与滤波结果是一种算术运算,即用加减乘除等运算实现,如均值滤波器(模板内像素灰度值的平均值)、高斯滤波器(高斯加权平均值)等。由于线性滤波器是算术运算,有固定的模板,因此滤波器的转移函数是可以确定并且是唯一的(转移函数即模板的傅里叶变换)。非线性滤波非线性滤波器的原始数据与滤波结果是一种逻辑关系,即用逻辑运算实现。如最大值滤波器、最小值滤波器、中值滤波器等。通过比较一定邻域内的灰度值大小来实现的,没有固定的模板,因而也就没有特定的转移函数(因为没有模板作傅里叶变换),另外,膨胀和腐蚀也是通过最大值、最小值滤波器实现的。滤波、模糊等之
我们都知道查询优化器,知道在查询优化器中会经历逻辑查询优化和物理查询优化。需要注意的是,查询优化器只能在已经确定的情况下(SQL语句、索引设计、缓冲池大小、查询优化器参数等已知的情况)决定最优的查询执行计划但实际上SQL执行起来可能还是很慢,那么到底从哪里定位SQL查询慢的问题呢?是索引设计的问题?服务器参数配置的问题?还是需要增加缓存的问题呢?性能分析来入手分析,定位导致SQL执行慢的原因。前面已经更新了总结核心的主要三点如何使用慢查询日志查找执行慢的SQL语句?如何使用EXPLAIN查看SQL执行计划?如何使用SHOWPROFILING分析SQL执行步骤中的每一步的执行时间?那讲了这这么多数据库服务器的优化分析的步骤是怎样的?中间有哪些需要注意的地方?本篇主要是针对这一个话题的总结和概括。数据库服务器的优化步骤当我们遇到数据库调优问题的时候,该如何思考呢?我把思考的流程整理成了下面这张图。整个流程划分成了观察(Showstatus)和行动(Action)两个部分。字母S的部分代表观察(会使用相应的分析工具),字母A代表的部分是行动(对应分析可以采取的行动)通过观察了解数据库整体的运
论一个很复杂的分组到底该怎么办第一次看到这么多分组头都大了。首先要考虑如何分组得到grouplist,其次考虑如何在limma包中分组分析。听说limma包的官方文档中对这些特殊的情况描述的很细致,于是我找到了这张图,觉得和我目前所面临的情况十分相似首先下载数据,rm(list=ls())##魔幻操作,一键清空~ options(stringsAsFactors=F) library(AnnoProbe) library(GEOquery) gse=geoChina('GSE51401') eSet=gse[[1]] probes_expr<-exprs(eSet);dim(probes_expr) head(probes_expr[,1:4]) boxplot(probes_expr,las=2) #probes_expr=log2(probes_expr+1) phenoDat<-pData(eSet) head(phenoDat[,1:4])复制由于我不会交叉着分组...所以直接把网页上的分组信息复制粘贴存为了TXT格式的GSE51401文件,然
packagexxx.driver.business.utils; /** *<p>Representsapointonthesurfaceofasphere.(TheEarthisalmost *spherical.)</p> * *<p>Tocreateaninstance,calloneofthestaticmethodsfromDegrees()or *fromRadians().</p> * *<p>Thiscodewasoriginallypublishedat *<ahref="http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates#Java"> *http://JanMatuschek.de/LatitudeLongitudeBoundingCoordinates#Java</a>.</p> * *@authorJanPhilipMatuschek *@version22September2
来源:子回blog.leapoahead.com/2015/09/06/understanding-jwt/JWT的组成签名的目的信息会暴露?JWT的适用场景JWT的组成一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。载荷(Payload)我们先将上面的添加好友的操作描述成一个JSON对象。其中添加了一些其他的信息,帮助今后收到这个JWT的服务器理解这个JWT。{ "iss":"JohnWuJWT", "iat":1441593502, "exp":1441594722, "aud":"www.example.com", "sub":"jrocket@example.com", "from_user":"B", "target_user":"A" } 复制这里面的前五个字段都是由JWT的标准所定义的。iss:该JWT的签发者sub:
LeetCode-36-Valid-SudokuDetermineifaSudokuisvalid,accordingto:SudokuPuzzles-TheRules. TheSudokuboardcouldbepartiallyfilled,whereemptycellsarefilledwiththecharacter‘.’. 判断一个二维数组是不是数独数组。要求是:同行同列,斜对角不能有相同的数组,这里需要定义三个数组,当然参考了一下讨论区一个大神的代码。采用行列,竖列和斜列。其中比较惊艳的是k=i/3*3+j/3;这里可以直接得到斜对角的元素。classSolution{ public: boolisValidSudoku(vector<vector<char>>&board){ intused1[9][9]={0},used2[9][9]={0},used3[9][9]={0}; for(inti=0;i<board.size();++i){ for(intj=0;j<board[i].size();++j){ if(board
本文转自机器之心,转载需授权原标题《Dota2被攻陷!OpenAI人工智能5V5模式击败人类玩家(4000分水平)》2017年,OpenAI在Dota2TI决赛现场以1对1solo的方式击败了「Dota2」世界顶级玩家。经过一年的发展,OpenAI于昨日宣布他们的AIbot在5v5团队赛中击败业余人类玩家,并计划之后能够击败顶级专业团队。机器之心对OpenAI的博客内容进行了编译介绍。我们团队构建的模型,OpenAIFive,已经击败业余Dota2团队了。虽然如今是在有限制的情况下,但我们计划到8月份在有限英雄池下击败TI赛中的一支顶级专业队伍。我们可能不会成功,因为Dota2是当前最流行也最复杂的电子竞技游戏之一,一批有激情与创造力的玩家经年训练,想要瓜分4000万美金的奖金池。通过自我对抗学习,OpenAIFive每天相当于玩180年的游戏。训练上,它使用256块GPU、12万8000个CPU核心使用近端策略优化(ProximalPolicyOptimization)方法进行训练,这是在我们去年建立的soloDota2系统上的扩增。当我们为每个英雄使用单独的一个LSTM,模型就可以
△HiBot的机器人王新民|编译自FastCompany 量子位·QbitAI出品万万没想到,美国人民喝个水也要和人工智能扯上关系了。有一家名叫HiBotUSA的公司,想要用机器人,大数据和人工智能结合起来,帮助美国各地的无数城市水务公司做更有效的老化管道升级工作,这将为城市自来水系统省下5000亿美元。事情的背景是这样的:自来水在美国一般由本地处理,由5万家市政公用事业公司负责调运和管理数百万英里的送水管道。由于自然老化以及外力因素,全国每年有24万个供水主断口,这些公用事业公司只能基于使用年龄随机更换使用年限长的供水管道。所谓“随机”,是说有的管道还好好的,却因为年纪太大被换掉了,而有些年限不长却快要坏掉了的管道,却没有更换。△TakashiKatoHiBotUSA的CEO広瀬茂男看到了机会,他说,由于污水和天然气管道受到高度监管,因此只能按照非常严格的规则进行检查和更换,相关公司和这方面的机器人公司形成了定向服务。但是对于自来水系统来说,其监管制度更有利于新玩家进入市场。位于加利福尼亚州的HiBotUSA公司是日本HiBot拆分出来的子公司,创始人広瀬茂男曾创造了在福岛核电站等“
2016年9月25日,我离开了,我待了接近8个月的梦想家园,离开了我梦想开始的地方,我真的好舍不得,舍不得离开那个地方,我感觉哪里是我所有的一切,我的什么事情都在哪里发生,我最大的决策,我人生中很多的感悟,包括人生的记忆,我曾说过,拼搏的人生,就要从自己的家乡开始,家乡的拼搏,人生的记忆,梦想的开始,我感觉人情,体会现实,拥有梦想,努力解决,迎接属于自己的3.0。 我哭泣过,我激动过,我努力过,在哪里,我成长过,跟爸爸妈妈吵嘴,心跳,迷茫,徘徊,求真,不管什么,都做到最好的决策,虽然,有时,自己也糊涂,但是我真怀念,感悟,而这所以的一切,都是我经历的人生中最为美好的一段时光。 在新的家里面,我领悟到,现在就是上天给我们,最好的安排,而这也是我现在,最好的归宿,很感谢,我认识到了一个全新的自己,让我有了勇气去追逐现在,去做自己的认为,神圣的梦想的开始。 生活真的还好长,而这才是刚刚开始,多么的体会,生活的这把大剪刀,如何的去剪出属于自己的人生,珍惜现在。。。。。。。 认为对,就去坚持,就去努力去做,珍惜现在,努力拼搏,坚持检查,纠正!!!!!
gRPC转换HTTP 一、前言 我们通常把RPC用作内部通信,而使用RestfulApi进行外部通信。为了避免写两套应用,我们使用grpc-gateway把gRPC转成HTTP。服务接收到HTTP请求后,grpc-gateway把它转成gRPC进行处理,然后以JSON形式返回数据。本篇代码以上篇为基础,最终转成的RestfulApi支持bearertoken验证、数据验证,并添加swagger文档。 正当有这个需求的时候,就看到了这个实现姿势。源自coreos的一篇博客,转载到了grpc官方博客gRPCwithRESTandOpenAPIs。 etcd3改用grpc后为了兼容原来的api,同时要提供http/json方式的API,为了满足这个需求,要么开发两套API,要么实现一种转换机制,他们选择了后者,而我们选择跟随他们的脚步。 他们实现了一个协议转换的网关,对应github上的项目grpc-gateway,这个网关负责接收客户端请求,然后决定直接转发给grpc服务还是转给http服务,当然,http服务也需要请求grpc服务获取响应,然后转为json响应给客户端。结构如图: 下面
1.passlib(https://passlib.readthedocs.io/en/stable/) passlib复制 目前常见的不可逆加密算法有以下几种: 一次MD5(使用率很高) 将密码与一个随机串进行一次MD5 两次MD5,使用一个随机字符串与密码的md5值再进行一次md5,使用很广泛 PBKDF2算法 bcrypt 其它加密算法 passlib是python2&3的密码散列库,它提供超过30种密码散列算法的跨平台实现,以及作为管理现有密码哈希的框架。它被设计成有用的对于范围广泛的任务,从验证/etc/shadow中找到的散列到为多用户应用程序提供全强度密码哈希。 示例: frompasslib.appsimportcustom_app_context #生成加密串 pwd='123456' hash_str=custom_app_context.encrypt(pwd) print(hash_str) #验证密码 custom_app_context.verify(pwd,self.password_hash)复制 &n
classB { public: B() { cout<<"defaultconstructor"<<endl; } ~B() { cout<<"destructed"<<endl; } B(inti):data(i) { cout<<"constructedbyparameter"<<data<<endl; } private: intdata; }; BPlay(Bb) { returnb; } int_tmain(intargc,_TCHAR*argv[]) { //下列结果是什么 Btemp=Play(5); //Play(5); getchar(); return0; } 第二题: main主函数执行完毕后,是否可能会再执行一段代码,给出说明? 答案:可以,可以用_onexit注册一个函数,它会在main之后执行 intfn1(void),fn2(void),fn3(void),fn4(void); voidmain(void) { Stringstr("zhanglin"); _one
分享习惯并常用的方式: db生成entity generatorConfig,使用maven插件: generatorConfig.xml <?xmlversion="1.0"encoding="UTF-8"?> <!DOCTYPEgeneratorConfigurationPUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"> <generatorConfiguration> <contextid="context1"> <commentGenerator> <!--是否去除自动生成的注释true:是:false:否--> <propertyname="suppressAllComments"value="true"/> </commentGenerator>
http://mp.weixin.qq.com/s?__biz=MzA3MDExMzcyMQ==&mid=200561357&idx=1&sn=0acd64668cca4a9a5565869da72edc34&scene=2&from=timeline&isappinstalled=0&key=e60cf81314c277c76b679b99971bb0f07485df261a27fa6e935156b316eb9f7b431220357ef8982f02db16ef22d8eabb&ascene=1&uin=MjIyNjA1OTU1 看了之后很有感触,在这人互联网唯块的时代,静下心来看看,不易
RecursionandTreeRecursion Q1:Subsequences AsubsequenceofasequenceSisasubsetofelementsfromS,inthesameordertheyappearinS.Considerthelist[1,2,3].Hereareafewofit'ssubsequences[],[1,3],[2],and[1,2,3]. Writeafunctionthattakesinalistandreturnsallpossiblesubsequencesofthatlist.Thesubsequencesshouldbereturnedasalistoflists,whereeachnestedlistisasubsequenceoftheoriginalinput. Inordertoaccomplishthis,youmightfirstwanttowriteafunctioninsert_into_allthattakesanitemandalistoflists,addstheitemtothebeginningo