1. import packages
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
2. 元素操作
清空文本
elm.clear()
输入文本
elm.send_keys('xxxx')
上传文件
------type = 'file'-----
elm.send_keys(r'/locate')
执行js
driver.execute_script()
切换浏览器
- 获取所有的浏览器窗口:wins = driver.window_handles
- driver.switch_to.wins(wins[-1])
driver.switch_to.wins(wins[0])
切换iframe
-
鼠标操作
- from selenium.webdriver.common.action_chains import ActionChains
- ActionChains(driver).move_to_element(elm).perform()
- ActionChains(driver).move_to_element(elm).click().perform()
etc
拖拽行为
- action = ActionChains(driver)
action.move_to_element(elm).click_and_hold().move_by_offset(x,y).release().perform()
隐式等待
- driver.implicitly_wait(x)
如果在x之前就加载出来,则不再等待
如果超过x未加载出来,则抛超时异常
显示等待
- from selenium.webdriver.common.by import By
from selenium.webedriver.support.wait import WebdriverWait
WebdriverWait(driver,15).until(EC.presence_of_element_located((By.Xpath,'loc')))
隐式等待是针对所有元素
显示等待只针对特定元素
执行js脚本
let jsscript = 'document.querySelector('input[id=""]).value=''
driver.execute_script(jsscript)
or
await driver.executeScript((val:string)=>{
let dom = document.querySelector('input[id=""]) as HTMLInputElement;
dom.value = val;
}, '')
请问如何实现用例失败或者异常时候需要截图? 使用webdriver中的截图类,WebDriver有提供用于截图的TakesScreenshot类 driver.getScreenshotAs
请问如何分布式执行webdriver用例? 方式一:利用jenkins分布式Master-slave来解决,selenium脚本不需要修改,环境部署好,可以直接跑 方式二:利用selenium grid分布式处理,这个有介绍过点击打开链接,剩下就是把selenium grid放到jenkins里面,让jenkins去管理,这个后续一篇介绍,这种方式,driver的url要改成hud的,脚本需要稍加修改
如何在脚本中执行 JavaScript 代码?
方式一:
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
String scriptContent = "function multiply(a,b) {return a*b;}";
//注册脚本
engine.eval(scriptContent);
Invocable invocable = (Invocable) engine;
//调用注册函数
System.out.println(invocable.invokeFunction("multiply", 2, 3));
方式二:
//使用管道流,将输出流转为输入流
PipedReader prd = new PipedReader();
PipedWriter pwt = new PipedWriter(prd);
//设置执行结果内容的输出流
engine.getContext().setWriter(pwt);
//js文件的路径
String strFile = Thread.currentThread().getClass().getResource("/").getPath() + "/abc.js";
Reader reader = new FileReader(new File(strFile));
engine.eval(reader);
BufferedReader br = new BufferedReader(prd);
//开始读执行结果数据
String str = null;
while ((str = br.readLine()) != null && str.length() > 0) {
System.out.println(str);
}
br.close();
pwt.close();
prd.close();
当定位策略都失败的时候,你该怎么做?
80%是你元素定位的不对,那么多定位方法,一个不行换另外一个,直接不能定位,先定位父元素,再循环找子元素。一般来说XPATH都能定位到,无非是可阅读性不强。真的全部失效,请求开发帮你改个元素属性好了。
如何查找一个文件大小超过5M的文件 find user -size +5000k -type f
Linux 中查找某个文件并删除它 find . -name '*.exe' -type f -exec rm -rf { }
Linux 查询 CPU、内存的指令 cat /proc/cpuinfo查看linux系统的CPU型号、类型以及大小 通过greap命令根据Physical Processor ID筛选出多核CPU的信息 cat /proc/meminfo查看linux系统内存大小的详细信息,可以查看总内存,剩余内存、可使用内存等信息。 df -h查看linux系统各分区的使用情况 free -m 查看linux系统内存使用量和交换区使用量
使用 Shell 获取 Nginx log 中接口包含 topic 且状态码为 200 的接口平均响应时间(越严谨越好)
cat nginx.log | grep ‘topic’ | grep ‘200’| awk -F ‘’ ‘{sum=sum+$1} END {print “sum=”,sum}’
Thread 类中的start() 和 run() 方法有什么区别? start() 启动时用的,只调用一次 run() 可以调用多次
说下左连接和右连接 左外连接:将左表为驱动表进行连接,结果数据包含左表全部数据,以及右表中和左表匹配的数据,左表中有,但右表中没有的数据显示null(取左边全部及右边部分数据) SELECT * FROM TABLE1 LEFT JOIN TABLE2 ON TABLE1.USERNAME=TABLE2.USERNAME
右外连接:将右表为驱动表进行连接,结果数据包含右表全部数据,以及左表中和右表匹配的数据,右表中有,但左表中没有的数据显示null(取右边全部及左边部分数据) SELECT * FROM TABLE1 RIGHT JOIN TABLE2 ON TABLE1.USERNAME=TABLE2.USERNAME
内连接:等值连接,返回两张表中都满足匹配条件的数据 (取两个表的交集) SELECT * FROM TABLE1 INNER JOIN TABLE2 ON TABLE1.USERNAME = TABLE2.USERNAME SELECT * FROM TABLE1 JOIN TABLE2 ON TABLE1.USERNAME=TABLE2.USERNAME
装饰器: 装饰器本质上是一个Python函数,其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值(return)也是一个函数对象。它经常用于有切面需求的场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景