平台: IDEA
POI 不用5.2.2, 会出错,使用5.0.0
导入web 驱动:
System.setProperty("webdriver.chrome.driver", "C:\\Users\\111\\Desktop\\javaone\\msedgedriver.exe");
WebDriver driver =new EdgeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
driver.get("https://www.amazon.com/");
driver.manage().window().maximize();
1. 鼠标移动到某个element:
Actions aaa = Actions(driver);
aaa.moveToElement(driver.findElement(By.id("icp-nav-flyout"))).build().perform();
2. 搜索框输入前,先点击,然后按下shit键,然后输入大写字母
Actions aaa= Actions(driver)
aaa.moveToElement(driver.findElement(By.id("twotabsearchtextbox"))).click().keyDown(Keys.SHIFT).sendKeys("Vincent").build().perform();
implicit wait: 全局定义,等待 n 秒在throw exception.
例如,设置5秒延时, 某个按钮需要2秒才能load出来,程序只需等待2秒。
explicit wait: taget a specific element. 等待目标出现。
只等待目标元素, explicit wait can be achieved in 2 ways:
1. WebDriverWait. 每毫秒检查一个元素,出现则执行下一步。
2. FluentWait = 10秒,2秒检查一次元素( 可以自定义多少秒检查一次)。
Fluent wai:
find the web element repeatedly at regular intervals of time until the timeout or till the object gets found .
Set windows = driver.getWindowHandles();
Iterator
String parentId = it.next();
String childId = it.next();
driver.switchTo().window(childId);
把驱动切换到浏览器子窗口。
frame
frame是一个容器,需要先switch 到容器才能进行操作。
driver.switchTo().frame(driver.findElement(By.cssSelector("iframe[class='demo-frame']) # 使用webelemtn来切换到容器。
driver.switchTo().frame(1)
driver.switchTo()
鼠标键盘的操作: Actions
鼠标拖动:
Actionis a = new Actionis(driver);
WebElement source = driver.findElement(By.id("draggable"));
WebElement target = driver.findElement(By.id("droppable"));
a.dragAndDrop(source,target).build().perform();
键盘操作:按下ctrl然后点击链接。
String key_ctrl = Keys.Chord(Keys.CONTROL,Keys.Enter);
driver.findElements(By.tagName("a")).sendKeys(key_ctrl);、
先取出footer_1, 然后再从里面取element.
WebElement footer_1 = driver.findElement(By.xpath("//table[@class='gf-t']//tr/td[1]"));
System.out.println(footer_1.findElements(By.tagName("a")).size());
切换窗口并获取每个窗口的标题:主要是如何使用getWindowHandles()
WebElement footer_1 = driver.findElement(By.xpath("//table[@class='gf-t']//tr/td[1]"));
System.out.println(footer_1.findElements(By.tagName("a")).size());
for(int i=1;i
String key_ctrl = Keys.chord(Keys.CONTROL, Keys.ENTER);
footer_1.findElements(By.tagName("a")).get(i).sendKeys(key_ctrl);
Thread.sleep(5000);
}
Set win = driver.getWindowHandles();
Iterator it = win.iterator();
while(it.hasNext())
{
driver.switchTo().window(it.next());
System.out.println(driver.getTitle());
}
Input的内容不是用getText(), 而是用.getAttribute("value")
String name = driver.findElement(By.xpath("//input[@id='autocomplete']")).getAttribute("value");
处理HTTPS certifications, 需要使用到option
EdgeOptions option =new EdgeOptions();
option.setAcceptInsecureCerts(true);
Proxy proxy =new Proxy(); #设置代理
proxy.setHttpProxy("ipaddress:10.1.1.1"); #设置代理
option.setCapability("proxy",proxy); #设置代理
Map prefs =new HashMap<>(); #设置默认下载路径
prefs.put("download.default_directory","/directory/path"); #设置默认下载路径
option.setExperimentalOption("prefs",prefs); #设置默认下载路径
WebDriver driver =new EdgeDriver(option);
这样就可以处理这个界面。
删除所有cookies
driver.manage().deleteAllCookies();
如何截图,是下面代码可以截图
File src = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(src,new File("C:\\SCREENSHOT.JPG"));
如何判断链接是否有效:如果有上百个链接,我们如何有效测试
String url = driver.findElement(By.cssSelector("a[href*='soapui']")).getAttribute("href");
HttpURLConnection conn = (HttpURLConnection)new URL(url).openConnection();
conn.setRequestMethod("HEAD");
conn.connect();
Integer respCode = conn.getResponseCode();
System.out.println(respCode);
Assert.assertTrue(false); #即时断言
java stream 和 lambda
ArrayList names =new ArrayList<>(); #创建一个列表
names.add("Vincent"); #添加名字
names.add("Join"); #添加名字
names.add("Amanda"); #添加名字
names.add("JJe"); #添加名字
names.add("Amy"); #添加名字
Integer count =0;
Long c = names.stream().filter(s -> s.startsWith("A")).count();
System.out.println(c);
Long d= Stream.of("Vincent","Join","Amanda","JJ","Amy").filter(s ->
{
s.startsWith("A");
return true;
}).count();
System.out.println(d);
names.stream().filter(s -> s.contains("e")).forEach(s -> System.out.println(s)); #打印包含e的名字
names.stream().filter(s -> s.startsWith("A")).map(s -> s.toUpperCase()).forEach(s -> System.out.println(s)); #A开头的名字转换成大写,打印出来。
List list_1 = Arrays.asList("Vincent","Join","Jason","Amy");
list_1.stream().filter(s -> s.startsWith("J")).sorted().map(s -> s.toUpperCase()).forEach(s -> System.out.println(s));
Stream newStream = Stream.concat(names.stream(),list_1.stream());
System.out.println("-----------------------------------------------");
newStream.forEach(s -> System.out.println(s));
boolean flag = names.stream().anyMatch(s -> s.equalsIgnoreCase("vincent"));
System.out.println(flag);
List ls = names.stream().filter(s -> s.startsWith("A")).map(s -> s.toUpperCase()).collect(Collectors.toList());
ls.stream().forEach(s -> System.out.println(s));
List numbers = Arrays.asList(13,3,1,1,9,11,7,15);
numbers.stream().distinct().sorted().forEach(s->System.out.println(s));
List创建的两种方法:
1.
ArrayList names =new ArrayList<>(); #创建一个列表
names.add("Vincent"); #添加名字
names.add("Join"); #添加名字
names.add("Amanda"); #添加名字
names.add("JJe"); #添加名字
names.add("Amy"); #添加名字
2.
List list_1 = Arrays.asList("Vincent","Join","Jason","Amy");
Selenium Relative Locators | Friendly Locators
先导入库:
import static org.openqa.selenium.support.locators.RelativeLocator.*;
1. above():
2. Below():
3. toLeftOf():
4. toRightOf()
Syntax: driver.findElement(withTagName("XX").above(WebElement)
WebElement label_name = driver.findElement(By.cssSelector("[name='name']"));
driver.findElement(with(By.tagName("label")).above(label_name)).getText();
遇到flex的元素,不能使用relative locator.
多窗口处理:
driver.switchTo().newWindow(WindowType.WINDOW); #打开一个新窗口
driver.switchTo().newWindow(WindowType.TAB); #打开一个新tab
driver.switchTo().window(name or handels) # 切换到另外的窗口,输入名字或windowID
driver.getWindowHandles(); #检查有多少个窗口。所有的窗口ID都存在set集合中。
因为结果是集合,所以要用集合变量
Set handels = driver.getWindowHandles();
Iterator it = handels.iterator(); # 通过迭代器来处理数据
String parentId = it.next(); #next()指针往下,取第一数
String childId = it.next(); #next() 指针往下,取第二数
driver.switchTo().window(childId); #切换到第二个窗口
只截图某个元素:
WebElement input_fild = driver.findElement(By.cssSelector("[name='name']"));
input_fild.sendKeys(link);
File file = input_fild.getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(file,new File("log.png"));
获取该元素的长和宽。
input_fild.getRect().getDimension().getHeight()
testNG 框架
方法:
1. include
2. exclude
3.
有4种声明:
1. @BeforeTest #在局部测试中第一个运行
2.@AfterTest #局部测试中最后一个运行
3. @BeforeSuite #在全局测试中第一个运行
4.@AfterSuite #全局测试中最后一个运行
5. @BeforeMethod #在mothod下,每个测试前都运行一次这个
6. @AfterMethod
7. @BeforeClass
8. @AfterClass
测试运行是按方法的字母排序,按顺序运行。
groups 有include和exclude
dependsOnMethods
先运行里面的方法,成功了再运行此方法
enable = false
当不需要测试此方法时可以使用enable=false。这样比删除和标注要好
timeout
可以只设置某个模块,如果某个模块需要更长的时候来等待,设置这个模块timeout, 不会导致整体测试效率。
parameter
全局定义个变量,然后带入mothod.
@DataProvider #创建一个二维数组data
public void Mobiletesting(String username, String password)
# 3行数据,执行三次方法。
wait.until 后面跟条件。
//标题是不是“百度一下,你就知道”
new WebDriverWait(driver,Duration.ofSeconds(60)).until(ExpectedConditions.titleIs(“百度一下,你就知道”));
//标题是不是包含“百度一下”
new WebDriverWait(driver,Duration.ofSeconds(60)).until(ExpectedConditions.titleContains(“百度一下”));
//判断该元素是否被加载在DOM中,并不代表该元素一定可见
new WebDriverWait(driver,Duration.ofSeconds(60)).until(ExpectedConditions.presenceOfElementLocated(By.xpath("//[@id=‘kw’]")));
//判断元素(定位后)是否可见
new WebDriverWait(driver,Duration.ofSeconds(60).until(ExpectedConditions.visibilityOf(driver.findElement(By.xpath("//
[@id=‘kw’]"))));
//判断元素是否可见(非隐藏,并且元素的宽和高都不等以0)
new WebDriverWait(driver,Duration.ofSeconds(60)).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//[@id=‘kw’]")));
//只要存在一个就是true
ExpectedConditions.presenceOfAllElementsLocatedBy(By.xpath("//
[@id=‘kw’]"));
//元素中的text是否包含语气的字符串
ExpectedConditions.textToBePresentInElementLocated(By.xpath("//[@id=‘kw’]"), “百度一下”);
//元素的value属性中是否包含语气的字符串
ExpectedConditions.textToBePresentInElementValue(By.xpath("//
[@id=‘kw’]"), “");
String.format("%.2f",80.234567) # 保留2位小数
JAVA中的this, supper
来源-Java——super关键字_BerglingYY的博客-CSDN博客_java super关键字
1、super是关键字,全部小写。
2、super和this对比:
this:
this能出现在实例方法和构造方法中。
this的语法: “this.” 、 “this ()”
this不能使用在静态方法中。
this.大部分情况下可以省略,在区分局部变量和实例变量的时候不可省略。
public void setName(String name){
this.name = name;
}
this () 只能出现在构造方法第一行,通过当前的构造方法去调用“本类”中其他的构造方法,目的是:代码复用。
super:
super能出现在实例方法和构造方法中。
super的语法: “super.” 、 “super ()”
super不能使用在静态方法中。
super.大部分情况下可以省略,在区分局部变量和实例变量的时候不可省略。
super什么时候不能省略?
super () 只能出现在构造方法第一行,通过当前的构造方法去调用“父类”中的构造方法,目的是:代码复用。 目的是:创建子类对象的时候,先初始化父类型特征。
3、super () 表示通过子类的构造方法调用父类的构造方法。模拟现实世界中这种场景:要想有儿子,先要有父亲。
4、重要结论:
当一个构造方法第一行:
既没有this()又没有super()的话,默认会有一个super();
表示通过当前子类构造方法调用父类的无参数构造方法。
所以必须保证父类的无参数构造方法是存在的。
5、this()和super()不共存。
6、无论怎样折腾,父类的构造方法是一定会执行的(100%)。
————————————————
版权声明:本文为CSDN博主「BerglingYY」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_62838185/article/details/122992825
使用group把下面
@Dataprovider
Listeners #创建一个类Listeners然后implements ITestListener, 重写所有方法。监听所有测试结果
Maven:
Page Object - JAVA的特点是面向对象, 我们把每个页面的元素都放在一个class中,然后再调用它,以后页面发生变化,只需要修改对应的页面class。
数据存放, 测试时将所有数据,包括网页地址都放在data.properties页面中,后续需要更改方便管理
Lombok的Slf4j的logging
在任意类中添加@Slf4j就可以使用log.
Lombok可以在maven中导入,或下周jar包导入。
如果运行出现
出现错误:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
那是缺少了以下的包,在maven中添加或者下载jar安装。
TestNG 中的Listener
1. 新建一个class来implement ITestListener
2. 重写你需要的方法
3. 在需要listen的类前面添加声明
Extentreport
1. 安装依赖包
2.创建一个实例方法
3.新建一个report, extent.createTest(result.getMethod().getMethodName());
4.结束report, extent.flush();