Java+selenium UI自动化
JavaScript&DOM
脚本使用
<head></head>
<script></script>
<body></body>
HTML DOM
可以让javascript了解到html的所有文档的元素
获取元素
使用 document.getElementById() 获取特定 ID 的元素。
使用 document.querySelector() 和 document.querySelectorAll() 通过 CSS 选择器获取单个或多个元素。
使用 document.getElementsByClassName() 和 document.getElementsByTagName() 获取类名或标签名匹配的元素集合。
修改元素内容
通过 innerHTML 属性修改元素的 HTML 内容。
通过 textContent 或 innerText 修改元素的纯文本内容。
修改元素属性
使用 setAttribute() 和 getAttribute() 设置或获取元素的属性值。
直接通过属性名修改,如 element.src = "new-image.jpg"。
修改样式
通过 style 属性直接修改内联样式,如 element.style.color = "red"。
使用 classList 操作类名,如 classList.add()、classList.remove() 和 classList.toggle()。
创建和添加元素
使用 document.createElement() 创建新元素。
通过 appendChild() 或 insertBefore() 将元素添加到 DOM 中。
使用 parentElement.removeChild() 移除子元素。
事件处理
使用 addEventListener() 为元素绑定事件监听器。
通过 removeEventListener() 移除事件监听器。
常见事件包括 click、mouseover、keydown 等。
遍历 DOM
使用 parentNode、childNodes、firstChild 和 lastChild 遍历节点。
通过 nextSibling 和 previousSibling 访问兄弟节点。
表单操作
通过 value 属性获取或设置表单元素的值。
使用 submit() 方法提交表单。
监听 submit 事件以处理表单提交行为。
动态加载内容
使用 fetch() 或 XMLHttpRequest 动态加载数据并更新 DOM。
通过 createElement 和 appendChild 动态生成内容。
性能优化
避免频繁操作 DOM,使用文档片段 DocumentFragment 批量操作。
使用事件委托减少事件监听器的数量。
对大量数据使用虚拟滚动或分页加载。
Selenium
Selenium IDE
Selenium WebDriver
基本元素定位:
id:唯一
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
//定位百度搜索框---id
driver.findElement(By.id("chat-textarea")).sendKeys("腾讯课堂");
注意点:自动提交情况的原因
1.百度搜索框的自动提交机制
百度搜索框有监听键盘事件,当你在输入框中输入内容后,有时会触发自动搜索
特别是在自动化测试环境中,Selenium的sendKeys()方法可能会触发某些事件
2.Selenium的sendKeys行为
sendKeys()方法在输入完成后,有时会模拟键盘事件
可能意外触发了回车键或表单提交
name:存在重复
tagname
classname
linktext:超链接的完整文本---精确匹配容易找不到,存在空格等匹配问题
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
//定位百度搜索框---id
//driver.findElement(By.id("chat-textarea")).sendKeys("腾讯课堂");
//打开超链接
driver.findElement(By.linkText("新闻")).click();
partialLinktext:超链接的部分/完整文本
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
//定位百度搜索框---id
//driver.findElement(By.id("chat-textarea")).sendKeys("腾讯课堂");
//打开超链接
driver.findElement(By.partialLinkText("新闻")).click();
css selector
·tagname
·id(#id)
package com.test;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.By.ById;
import org.openqa.selenium.edge.EdgeDriver;
public class ElementLocate {
public static void main(String[] args) {
EdgeDriver driver =new EdgeDriver();
// 最大化窗口
driver.manage().window().maximize();
// 设置隐式等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
//打开百度页面
driver.get("https://www.baidu.com");
//定位百度搜索框---id
//driver.findElement(By.id("kw")).sendKeys("腾讯课堂");
//打开超链接
//driver.findElement(By.partialLinkText("新闻")).click();
//css selector选择器定位
driver.findElement(By.cssSelector("#chat-textarea")).sendKeys("疯狂动物城");
driver.findElement(By.cssSelector("#chat-submit-button")).click();
}
}
·classname(.classname)
·精确定位:标签名[属性1='属性值'][属性2='属性值']
xpath
相对路径:
//:匹配指定节点
*通配符
@选取属性
[]属性判断条件表达式:
·通过属性查找

·通过函数text()/contains()查找

元素操作API
click()
clear()
sendKey()
getTagName():获取元素的标签名
getAtrribute(属性名):根据属性名获取元素的属性值
getText():获取当前元素的文本值
isDisplayed():查看元素是否显示
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
WebElement element1 =driver.findElement(By.id("chat-textarea"));
System.out.println("搜索框的标签名为"+element1.getTagName());
System.out.println("搜索框的classname属性为"+element1.getAttribute("classname"));
WebElement element2=driver.findElement(By.xpath("//a[contains(text(),'新闻')]"));
System.out.println("新闻的文本为:"+element2.getText());
System.out.println("元素是否显示"+element2.isDisplayed());

WebDriver相关API
get(url)
getCurrentUrl():获得当前的路径
getTitle():获取标题
getPageSource()::获取页面源代码
quit():关闭页面
package com.test;
import org.openqa.selenium.edge.EdgeDriver;
public class WebDriveroperate {
public static void main(String[] args) throws InterruptedException {
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
System.out.println(driver.getCurrentUrl());
System.out.println(driver.getTitle());
System.out.println(driver.getPageSource());
driver.quit();
}
}
close():关闭当前窗口(百度-》新闻,关闭百度窗口)
getWindowHandle():返回页面句柄(页面标志)
getWindowHandles():返回所有由驱动对象打开页面的所有句柄,页面不同,句柄不同
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
System.out.println("新窗口打开前的句柄:"+driver.getWindowHandle());
// System.out.println(driver.getCurrentUrl());
// System.out.println(driver.getTitle());
// System.out.println(driver.getPageSource());
// driver.quit();
driver.findElement(By.partialLinkText("新闻")).click();
Thread.sleep(3000);
System.out.println("新窗口打开后的句柄:"+driver.getWindowHandle());
System.out.println("新窗口打开后的所有句柄:"+driver.getWindowHandles());

注意点:当打开新的窗口默认在旧的句柄
manage():此方法可以获取Options--浏览器菜单操作对象
Options option=driver.manage();
option.window().fullscreen();//最大化窗口
Dimension dimension=option.window().getSize();
System.out.println("当前窗口的高度"+dimension.getHeight());
System.out.println("当前窗口的宽度"+dimension.getWidth());
System.out.println("当前窗口的位置X坐标"+option.window().getPosition().getX()+",当前窗口的位置Y坐标"+option.window().getPosition().getY());

navigate对象--导航对象
Navigation nav=driver.navigate();
//访问京东
nav.to("https://www.jd.com");
//刷新
nav.refresh();
//回退
nav.back();
//前进
nav.forward();
三大等待---重点!!!!!!
代码执行速度太快,UI元素没有立马显示出来导致两者不同步从而元素找不到
强制等待:Thread.sleep();---用户自己定义
显示等待:用来等待某个条件发生之后在继续执行后续代码(如找到元素、元素可点击、、元素以已显示)
package com.test;
import java.time.Duration;
import org.openqa.selenium.By;
import org.openqa.selenium.Dimension;
import org.openqa.selenium.WebDriver.Navigation;
import org.openqa.selenium.WebDriver.Options;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class WebDriveroperate {
public static void main(String[] args) throws InterruptedException {
EdgeDriver driver =new EdgeDriver();
//打开百度页面
driver.get("https://www.baidu.com");
Navigation nav=driver.navigate();
// //访问京东
nav.to("https://www.jd.com");
// //回退
nav.back();
//设置显示等待。15s
WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(15));
//等到新闻元素可见就点击
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"s-top-left\"]/a[1]")));
driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[1]")).click();
}
}

隐式等待:在设置的超时时间范围范围内不断查找元素知道找到元素或者超时
driver.manage.timeouts,implicitlyWait(lng time,TimeUnit unit);
优点:相对灵活
缺点:设置是针对全局的,在WebDriver实例整个生命周期有效啊,但并不是所有元素都需要等待
注意点:在实例化完成之后就设置隐式等待
特殊元素定位与操作
模态框---alert
Alert alert =driver.switchTo().alert();
alert.accept();
alert.dismiss();
alert.getText();
模态框---confirm(有确定和取消)
Alert alert =driver.switchTo().alert();
alert.accept();
alert.dismiss();
alert.getText();
iframe切换--内嵌网页切换
四种切换:
driver.switchTo().frame(index);
driver.switchTo().frame(id);
driver.switchTo().frame(name);
driver.switchTo().frame(WebElement);
切换之后--->driver.switchTo().defaultContent();回到默认内容页面(否则找不到元素)
window切换
操作另一个窗口页面的元素时,一定要注意先切换窗口的切换方式:传入要操作窗口的name或者句柄
driver.switchTo().window(name/Hnadle)
难点:如何切换句柄呢
//由于跳转之后窗口的句柄值仍然不会改变,操作的滑盖式原来的窗口,故而要切换窗口
Set<String> handles=driver.getWindowHandles();
//对窗口集合进行遍历
for(String handle:handles) {
driver.switchTo().window(handle);
//我如何知道窗口的真正句柄呢
if(driver.getTitle().equals("百度新闻——海量中文资讯平台")) {
break;
}
}
//对百度新闻进行定位
driver.findElement(By.id("ww")).sendKeys("window跳转");
select下拉框(必须是select标签)
如果页面元素是一个下拉框,我们可以将此web元素封装为Select对象
·Select select =new Select(WebElement element);
Select对象常用api
select.getOptions():获取所有选项
select.selectByIndex(index):根据索引选中对应的元素
select.selectByValue(value):选择指定value值对应的选项
select.selectByVisible(text):选中文本值对应的选项
时间日期控件
1.控件没有限制手动输入,则直接调用sendKeys方法写入时间数据
2.控件有限制输入,则可以执行一段js来改变元素的value属性值
JavascriptExecutor jsExecutor=(JavascriptExecutor) driver
jsExecutor.executeScript();
鼠标操作
Actions类模拟鼠标键盘操作+perform方法执行
Actions actions =new Actions(WebElement element);//实例化actions对象
actions.方法.release().build().perform()
文件上传
1.直接使用sendKeys写入文件的路径(input标签,type为file)
2.必须使用第三方工具(比如autoit)
验证码
去除验证码
自动识别
万能验证码(推荐)
页面自动化测试(selenium+testng)
采用PO模式:
将页面抽象成为一个类:
- 属性:url元素/元素定位表达式;
- 方法(功能):业务流程操作
优点:高内聚低耦合(耦合只需要driver实例化)
更多推荐
所有评论(0)