2022-04-10 Java selenium

平台: 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 it = windows.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的mothod

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把下面里面的group是“Smoke"的运行

               

   

   

   

   




@Dataprovider





Listeners     #创建一个类Listeners然后implements ITestListener, 重写所有方法。监听所有测试结果


需要在xml里面写入。



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();


你可能感兴趣的:(2022-04-10 Java selenium)