慕测web安全测试软件下载及使用
本次web测试比赛主要分为三个部分,使用Selenium编写自动化测试脚本,使用Jmeter编写性能测试脚本,使用Appium编写移动应用测试脚本。
在写这篇随笔的时候Selenium环境已经配好了,相对也比较简单,所以这边稍微提一下。
Selenium编写自动化测试脚本
下载eclipse,下载chorm版本对应的chormdriver,下载安装Selenium包
然后通过Selenium编写如下图所示的自动化脚本进行测试:
Selenium定位不到指定元素原因之iframe(unable to locate element)
切换iframe
selenium提供了switch_to.frame()方法来切换frame
// 方法:1:根据iframe的id或name切换
driver.switchTo().frame("needit");
driver.switchTo().frame("ueditor_0");
注意:
可能你会这样写:switch_to_frame(),但会发现,这段代码被加上“删除线”了;
原因是这个方法已经out了,之后可能被废弃,建议switch_to.frame()
switch_to****.frame(reference)中的reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象。
如下图中的 id、name。
如果没有id、name属性的化,可以通过xpath匹配WebElement对象进行定位。
// 方法:1:根据iframe的id或name切换
driver.switchTo().frame("needit");
driver.switchTo().frame("ueditor_0");
// 切出iframe
driver.switchTo().defaultContent();
// 方法2:把iframe当作页面元素进行切换
WebElement iframe1 = driver.findElement(By.cssSelector("iframe.needit"));
driver.switchTo().frame(iframe1);
WebElement iframe2 = driver.findElement(By.cssSelector("iframe[frameborder='0']"));
driver.switchTo().frame(iframe2);
// 切出iframe
driver.switchTo().defaultContent();
// 方法3:将iframe存储到list中,然后根据ifrane的索引定位
List<WebElement> iframeElements = driver.findElements(By.tagName("iframe"));
System.out.println("iframe List的长度是:"+iframeElements.size());
driver.switchTo().frame(0);
driver.switchTo().frame(1);
// 切出iframe
driver.switchTo().defaultContent();
Selenium-java 登录后重定向页面(页面跳转后)刷新页面
driver.switch_to.window(wins[-1]) #列表最后一个是最新的窗口
public static void main(String[] args) {
// 打开浏览器访问目标网页
System.setProperty("webdriver.chrome.driver", "webdriver/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.baidu.com");
driver.manage().window().maximize();
driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
// 新开浏览器窗口
driver.findElement(By.xpath("//a[text()='新闻']")).click();
// 只有两个窗口时,通过窗口的句柄是否等于默认窗口判断是否切换
String mainHandle = driver.getWindowHandle();
Set<String> Handles = driver.getWindowHandles();
for (String hand : Handles) {
if (!hand.equals(mainHandle)) {
driver.switchTo().window(hand);
break;
}
}
System.out.println("切换后的新窗口是:" + driver.getTitle());
// 切回原窗口,点击打开新的窗口
driver.switchTo().window(mainHandle);
driver.findElement(By.xpath("//a[text()='hao123']")).click();
// 此时已有三个浏览器窗口,通过窗口title判断
Set<String> Handles1 = driver.getWindowHandles();
for (String hand : Handles1) {
if (driver.switchTo().window(hand).getTitle().equals("hao123_上网从这里开始")) {
driver.switchTo().window(hand);
break;
}
}
System.out.println("切换后的新窗口是:" + driver.getTitle());
driver.quit();
}
selenium使用已打开的浏览器
在使用selenium的时候,通常都是在后台默默的执行操作,但是有的时候会想要让selenium直接使用当前已经打开的浏览器
我这里只尝试了Google Chrome
首先,需要从命令行启动google-chrome,并添加参数
chrome --remote-debugging-port=9222
然后在打开的浏览器中,就可以作为爬虫的浏览器,比如,可以访问某一个地址
然后使用selenium直接接管当前浏览器,进行操作
ChromeOptions options = new ChromeOptions();
options.setExperimentalOption("debuggerAddress", "127.0.0.1:9222");
// options.addArguments("proxy-server=http://10.11.11.11:1234");
// options.addArguments("disable-notifications");
// options.addArguments("disable-popup-blocking");
// options.addArguments("disable-extensions");
// options.addArguments("disable-infobars");
// options.addArguments("start-maximized");
// options.setPageLoadStrategy(PageLoadStrategy.NONE);
WebDriver driver = new ChromeDriver(options);
System.out.println(driver.getTitle());
这个时候,输出的就是当前已打开浏览器打开的界面了
鼠标悬停操作
import org.openqa.selenium.interactions.Actions;
WebElement settings = driver.findElement(By.xpath("//*[@id='u1']/a[8]"));
Actions action = new Actions(driver);
action.moveToElement(settings).perform();
JMeter编写性能测试脚本
JMeter的下载相对上面的自动化脚本环境要相对简单,就是一个jar包。但是使用起来却比自动化脚本的编写复杂很多。上面自动化脚本就是简单的java脚本编写。
Thread Group
-
线程数:模拟的用户数量
-
Ramp-up Period(in seconds):达到指定线程数所需要的时间。
在调度器复选框被选中的前提下:
-
持续时间(秒):在此选项填入N,说明这个计划,从某个开始时间 算起,执行N秒后结束。(会忽略结束时间的选项)
-
启动延迟(秒):在此选项填入N,手动点击开始执行计划,然后延 迟N秒后,计划才真正开始执行。(会忽略 启动时间的选项)
-
启动时间:当点击开始测试时,将等到此处填写的启动时间,然后真 正开始测试。
-
结束时间:当开始测试时,将等到指定的开始时间开始测试,然后会 停在此处填写的时间点结束。
-
Transaction Controller
事务控制器会产生一个额外的取样器(sampler),用来计算衡量它所包 含的所有测试组件(比如包含2个http采样器)的总体时间
HTTP(S) Request
使用BadBoy或者使用Jmeter自带的HTTP代理服务抓取请求。
Synchronizing Timer
Number of Simulated Users to Groupby: 每次释放的线程数量。如果设置为0,等于设置为线程租中的线程数量。
CSV Data Set Config
实现请求参数化。
- Filename:文件路径(包括目录和文件名),CSV文件使用相对路径, 和脚本放在同一级目录下
- File encoding:编码方式,建议utf-8,为了防止存在中文时乱码
- Variable Names(Comma-delimited):设置变量名,供其他功能 调用。如果存在多个变量 时,用,隔开
- Delimiter(use“\t” for tab):是指在提取有多个参数时,在文 件中已那个符号为分界点,进行提取
- Recycle on EOF:是否循环读取文件中的参数,设置为True,在循环 数超过数据时,会再次从第一条开始读取;设置为False,在读取到最 后一条 后,不再从第一条开始读取数据;
- Stop thread on EOF?:是否在读取完最后一条数据后,停止线程;
- Sharing mode:共享方式;一般使用默认就行(所有线程共享),可根据实际需求修改
Appium编写移动应用测试脚本
1.安装node.js(0.8版本及以上)
安装完成后,运行cmd(或其他终端),输入node –v,如果安装成功,会输出版本信息
2.配置Java环境
3.配置Android sdk环境
可以使用Android sdk managerhttp://www.androiddevtools.cn/。
我直接下了个Android studio,一步到位。
配置环境变量
export ANDROID_HOME=/Users/sdk
export PATH=$PATH:$ANDROID_HOME/tools
export PATH=$PATH:$ANDROID_HOME/platform-tools
4.安装Appium
brew install Appium
打开appium客户端
adb连接虚拟机
>adb connect 127.0.0.1:62001
https://www.cnblogs.com/mik-hello/p/15308261.html安卓xpath定位
https://blog.51cto.com/u_15354476/5342062
appPackage和appActivity获取:
首先在android手机或模拟器上打开App,输入下面的abd命令:
adb shell dumpsys window windows | findstr mFocusedApp