selenium 作为现在最主流的UI自动化框架,基本成为了自动化测试必备的技能,本文是笔者在学习的时候做的笔记,也是实战内容。
一、selenium相关配置: 1、官方文档地址:https://www.selenium.dev/documentation/zh-cn/
2、谷歌各版本下载http://www.chromedownloads.net/chrome64win/
3、谷歌驱动下载http://npm.taobao.org/mirrors/chromedriver
4、禁止谷歌浏览器更新https://jingyan.baidu.com/article/76a7e409f2137afc3b6e15be.html
5、selenium工作流程● selenium client(Java等语言编写的自动化测试脚本)初始化一个service服务,通过Webdriver启动浏览器驱动程序
● 通过RemoteWebDriver向浏览器驱动程序发送HTTP请求,浏览器驱动程序解析请求,打开浏览器,并获得sessionid,如果再次对浏览器操作需携带此id
● 打开浏览器,绑定特定的端口,把启动后的浏览器作为webdriver的remote server
● 打开浏览器后,所有的selenium的操作(访问地址,查找元素等)均通过RemoteConnection链接到remote server,然后使用execute方法调用_request方法通过urlib3向remote server发送请求
● 浏览器通过请求的内容执行对应动作
● 浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本
二、selenium的基本使用 1、添加依赖
依赖地址:https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java
2、设置驱动org.seleniumhq.selenium selenium-java3.141.59
想要使用selenium启动浏览器必须先下载对应版本的浏览器驱动,下载后需要进行设置*
- 设置驱动有两种方式
- 设置环境变量: 将驱动设置成电脑的环境变量
- 直接在代码中声明驱动位置:
System.setProperty("webdriver.chrome.driver", "src/test/resources/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
driver.get("https://www.baidu.com");
三、selenium三大等待 1、硬性等待(不推荐)
// 会一直等到设置的睡眠时间结束,造成时间浪费,一般调试用 Thread.sleep(long millis);2、隐式等待
在设置的超时时间范围内不断查找元素,直到找到元素或者超时
如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
优点:相对灵活
缺点:
设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待。
不能适用条件更复杂的情况,如:元素可点击、元素可见
隐式等待是selenium服务器上在等待
driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);3、显示等待
显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续
代码(如找到元素、元素可点击、元素已显示等)
优点: 每隔一段时间500ms扫描一次页面,检查元素是否满足等待结果条件,比如查找
元素,则检查元素是否存在,不存在则继续等待,直到找到或超时。
缺点:该方式不是全局设置,因此特定需要等待的元素可以这样处理,推荐优先使用这一种方法。
显示等待是java脚本客户端在等待
// 等待元素可被点击
WebDriverWait wait = new WebDriverWait(driver,5);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//a[text()='官方']"))).click();
显示等待常用等待方法:
| 方法 | 等待条件 |
|---|---|
| presenceOfElementLocated | 页面元素在页面中存在 |
| visibilityOfElementLocated | 页面元素在页面存在并且可见 |
| elementToBeClickable | 页面元素是否在页面上可用和可被单击 |
| frameToBeAvailableAndSwitchToIt | 切换到iframe中,返回值为boolean类型 |
四、元素定位
在谷歌浏览器中,可以使用F12在console中用(’#custom-bg-preview’),也可以使用 x ( x p a t h 表 达 式 ) 利 用 x p a t h 进 行 定 位 x(xpath表达式)利用xpath进行定位 x(xpath表达式)利用xpath进行定位x(’//[@title=“搜索主题、帖子、用户或分类”]’)``*`
1、css选择器常用表达式
参考:https://www.w3school.com.cn/cssref/css_selectors.asp
| 选择器 | 例子 | 描述 |
|---|---|---|
| .class | .classStyle | 选中所有的元素 |
| #id | #idname | 选中所有id="idname"的元素 |
| * | * | 选择所有元素 |
| tagName | input | 选择所有input元素 |
| ele,ele | div,input | 选择所有div和input元素 |
| ele ele | div input | 选中div内所有的input元素 |
| ele>ele | div>input | 选中父类有div的所有input元素 |
| ele+ele | div+input | 紧接再div后面的inout元素 |
| [attribute] | [name] | 选择带有name属性的所有元素 |
| [attribute=value] | input[name=“x1”] | 选择name=x1的所有input元素 |
| 表达式 | 结果 |
|---|---|
| / | 从根节点选取 |
| // | 相对位置选取,不考虑当前位置 |
| /
// 用moveTo来实现拖动
new Actions(driver).clickAndHold(driver.findElement(new By.ById("dragger")))
.moveToElement(driver.findElement(new By.ByXPath("//div[text()='Item 2']")))
.release().perform();
Thread.sleep(3000);
}
六、多窗口和多frame的切换 1、多窗口切换 //获取所有窗口句柄
Set
2、多frame切换 与切换窗口类似
// 获取到frame的id或name
driver.switchTo().frame(iframeIdOrName);
// 还可以直接获取到frame元素 进行切换
driver.switchTo().frame(frameElement);
// 如果外层没有写明的iframe 则可直接跳到Parentframe
driver.switchTo().parentframe(frameElement);
七、对Javascript元素进行操作
JavascriptExecutor jsExecutor=(JavascriptExecutor) driver;
jsExecutor.executescript("jsscript");
WebElement element = driver.findElement(By.id("xx"));
JavascriptExecutor jsExecutor=(JavascriptExecutor) driver;
jsExecutor.executescript("arguments[0]...",element);
1、元素属性操作实例
@Test
public void test1() throws InterruptedException {
driver.get("https://www.12306.cn/index/");
WebElement timeELe = driver.findElement(By.id("train_date"));
JavascriptExecutor executor = (JavascriptExecutor) driver;
// 删除只读属性 进行手动输入日期
executor.executescript("arguments[0].removeAttribute('readonly')",timeELe);
timeELe.clear();
timeELe.sendKeys("2020-07-18");
Thread.sleep(5000);
}
public void chooseSex(String sex) {
WebElement chooseSex;
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
// 利用js选中性别
if (sex.equals("男")) {
chooseSex = waitElementVisible(male);
} else {
chooseSex = waitElementVisible(female);
}
jsExecutor.executescript("arguments[0].checked=true", chooseSex);
}
2、滚动屏幕找到目标元素
// 从页面顶部滚动到页面底部方法
executor.executescript("window.scrollTo(0, document.body.scrollHeight)");
executor.executescript("window.scrollBy(0, document.body.scrollHeight)");
@Test
public void test1 () throws InterruptedException {
driver.get("https://sj.qq.com/myapp/category.htm?orgame=1");
// 懒加载页面 滚动获取页面元素
// 循环滚动页面 找到需要的元素则停止 或者到了页面底部则不再滚动
while (true){
if(driver.getPageSource().contains("抖音短视频")){
// 找到则点击该元素并退出循环
System.out.println("找到元素了");
driver.findElement(By.xpath("//a[text()='抖音短视频']")).click();
Thread.sleep(6000);
break;
}
// 没找到则继续滚动页面
// 先获取滚动页面之前的页面数据
String beforeSource = driver.getPageSource();
// 进行页面的滚动
JavascriptExecutor executor = (JavascriptExecutor) driver;
executor.executescript("window.scrollTo(0, document.body.scrollHeight)");
Thread.sleep(5000);
// 获取滚动页面后的元素
String afterSource = driver.getPageSource();
// 查看滚动前和滚动后的页面元素是否一样 一样则代表到达页面底部了 退出循环
if(beforeSource.equals(afterSource)){
System.out.println("元素未找到");
break;
}
}
}
// 非懒加载无需循环滚动可直接滚动到目标元素位置
// 滚动到目标元素
executor.executescript("arguments[0].scrollIntoViewIfNeeded(true)", targetEle);
@Test
public void test2() throws InterruptedException {
driver.get("https://ke.qq.com/");
WebDriverWait wait = new WebDriverWait(driver,5);
WebElement targetEle = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[text()='设计·创作']")));
JavascriptExecutor executor = (JavascriptExecutor) driver;
// 滚动到目标元素
executor.executescript("arguments[0].scrollIntoViewIfNeeded(true)", targetEle);
Thread.sleep(6000);
}
八、文件上传 1、input元素可直接用element.sendKey()输入地址方式 WebElement ele = driver.getElement(By.id("imagUpload"));
ele.sendKey(filePath);
2、Selenium+Autolt上传文件 九 弹框处理
// alert对话框
public void testalert() {
//获取alert对话框
alert alert = driver.switchTo().alert();
//获取对话框文本
String text = alert.getText();
//打印警告对话框内容
System.out.println(text);
//alert对话框属于警告对话框,我们这里只能接受弹窗
alert.accept();
}
// /confirm/i确认框
public void test/confirm/i() {
//获取/confirm/i对话框
alert alert = driver.switchTo().alert();
//获取对话框的内容
String text = alert.getText();
//打印对话框的内容
System.out.println(text);
//点击“确认”按钮
alert.accept();
// 点击“取消”按钮
alert.dismiss();
}
// prompt
public void testprompt() {
//获取prompt对话框
alert alert = driver.switchTo().alert();
//获取对话框的内容
String text = alert.getText();
//打印对话框的内容
System.out.println(text);
//在弹框内输入信息
alert.sendKeys("软件测试");
//点击“确认”按钮,提交输入的内容
alert.accept();
}
十、除谷歌外的驱动设置 1、火狐浏览器
WebDriver driver = new FirefoxDriver();
System.setProperty("webdriver.gecko.driver", "/path/to/geckodriver");
2、Edge
WebDriver driver = new EdgeDriver();
System.setProperty("webdriver.edge.driver", "C:/path/to/MicrosoftWebDriver.exe");
3、IE浏览器
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
WebDriver driver = new InternetExplorerDriver();
System.setProperty("webdriver.ie.driver", "C:/path/to/IEDriver.exe");
4、safari
● 先在终端运行 import org.openqa.selenium.WebDriver; import org.openqa.selenium.safari.SafariDriver; WebDriver driver = new SafariDriver(); 以上就是本人selenium一些基础实战内容,自动化入门的话已经足够了,当然了想要更加深入的进行UI自动化还需要学习pageObject框架、数据驱动等内容。这个后续我也会讲到 Python相关栏目本月热门文章
热门相关搜索
路由器设置
木托盘
宝塔面板
儿童python教程
心情低落
朋友圈
vim
双一流学科
专升本
我的学校
日记学校
西点培训学校
汽修学校
情书
化妆学校
塔沟武校
异形模板
西南大学排名
最精辟人生短句
6步教你追回被骗的钱
南昌大学排名
清朝十二帝
北京印刷学院排名
北方工业大学排名
北京航空航天大学排名
首都经济贸易大学排名
中国传媒大学排名
首都师范大学排名
中国地质大学(北京)排名
北京信息科技大学排名
中央民族大学排名
北京舞蹈学院排名
北京电影学院排名
中国戏曲学院排名
河北政法职业学院排名
河北经贸大学排名
天津中德应用技术大学排名
天津医学高等专科学校排名
天津美术学院排名
天津音乐学院排名
天津工业大学排名
北京工业大学耿丹学院排名
北京警察学院排名
天津科技大学排名
北京邮电大学(宏福校区)排名
北京网络职业学院排名
北京大学医学部排名
河北科技大学排名
河北地质大学排名
河北体育学院排名
|



