后台服务器(java)——api接口(桥梁,适配)——requests
web自动化原理:
浏览器 ——selenium(webdriver)——python代码 selenium
webdriver提供的接口api模式
selenium 怎么和webdriver交互?通过http请求。通过python代码向webdriver发送http请求。
不同的driver相当于和浏览器之间的翻译。
面试题:selenium采用的是什么协议?http协议
进行web自动化测试的原因:
1.显示的数据不一定是后端返回的数据
2.兼容性
3.UI交互
标记性语言:
HTML:超文本标记语言,Hyper Text Markup language 方便查找,快速定位
采用键值对的形式:<key>value</key> key是指定的标签,规范,标准
XML <key>value</key> key是自定义的标签
markdown
标记性语言只是负责结构化的展示,不负责美化和动态。css和js怎么可以放在html里面的,html发展支持了这样的扩展进行导入。就像python里可以加载c一样
HTML:radio 单选 checkbox默认选中 readonly只对输入框生效只读 默认为true。 disabled不能使用
readonly和disabled的区别:readonly只针对input(text/password)和textarea有效。而disabled对于所有的表单元素都有效,包括select,redio,checkbox,button等。表单在使用了disabled后,要将表单以post或get方式提交的话,这个元素的值不会被传递出去。而readonly会将会将值传递出去。
JavaScript:
<Script>
var a=1;
function run(){
IF (a>8){
console.log("我最棒")
return a+8;
}
else if (a<4){
return a;
}
}
run();
</Script>
DOM: Document Object Mode 文档对象模型。 把文本映射成一个dom对象。就是把HTML中的各种元素映射成js可以访问的对象。1.查找元素2.修改元素3.操作浏览器
ID name classname tagname querySelector
文档中的所有元素都可以看做节点。documen代表整个文档。documen.getElementById("") document.querySelector, document.querySelectorAll
element.textContent.
DOM修改:
innerHTML:可以修改所有
innerText:可以修改整个元素的id等属性
value:element.value("kkjjhd")
setAttribute:element.setAttribute('id','hello')
getAttribute("maxlength") 可以获取可以修改
改变样式style,color
改变 disabled,readonly
事件监听:
onchange html元素改变
onclik 用户点击html元素
onmouseover 用户从一个html元素上移动鼠标
onmouseout 用户从一个html元素上移开鼠标
onkeydown 用户按下键盘按键
onload 浏览器已完成页面的加载
1.前进 driver.forward()
2.刷新:driver.refresh()
3.设置窗口大小:driver.set_window_size(400,300)
4.最大化:driver.maximize_window()
5.最小化:driver.minimize_window()
6.后退:driver.back()
7.获取截图:driver.save_screenshot(‘demo.png’)
8.关闭 :driver.close()
9.退出:driver.quit()
查看源码;ctrl+B 查看详细源码 ctrl+shift+i
self.service = Service( executable_path, port=port, service_args=service_args, log_path=service_log_path) self.service.start()
start方法:
try: cmd = [self.path] cmd.extend(self.command_line_args()) self.process = subprocess.Popen(cmd, env=self.env, close_fds=platform.system() != 'Windows', stdout=self.log_file, stderr=self.log_file, stdin=PIPE) except TypeError: raise
webdriver原理:
1.初始化一个service并且启动这个service
start()方法:主题逻辑,通过命令行的——subprocess.Popen形式打开chromedriver.exe文件 ,也就是放在python根目录下的驱动
2.初始化一个ChromeRemoteConnection连接器,通过execute方法urllib3库进行网络请求。请求上面的service服务器。来访问了service_url也就是service中的一个属性。定义了一些谷歌特有的接口地址。接口地址全部封装在chromedriver.exe中。只有执行self.execute方法才是调用请求。
commands中有很多URL地址,封装各种各样的方法,get访问服务器,find-element找元素。所有方法做的事情都是execute访问了subprocess也就是url地址。
command_executor=ChromeRemoteConnection( remote_server_addr=self.service.service_url, keep_alive=keep_alive), desired_capabilities=desired_capabilities)
class ChromeRemoteConnection(RemoteConnection): def __init__(self, remote_server_addr, keep_alive=True): RemoteConnection.__init__(self, remote_server_addr, keep_alive) self._commands["launchApp"] = ('POST', '/session/$sessionId/chromium/launch_app') self._commands["setNetworkConditions"] = ('POST', '/session/$sessionId/chromium/network_conditions') self._commands["getNetworkConditions"] = ('GET', '/session/$sessionId/chromium/network_conditions') self._commands['executeCdpCommand'] = ('POST', '/session/$sessionId/goog/cdp/execute') 通过python标准库 urllib3来访问服务器的地址。requests通过 urllib3来实现的。只是封装了requests
execute方法:执行请求的方法。