Java Selenium学习笔记

目录

前言:

1、获取WebElement/WebElements

2、WebElement常用方法:

3、driver.get()和driver.navigate().to()到底有什么不同?

4、下拉菜单(Select)的操作(不常用)

5、Selenium窗口切换

6、Selenium框架切换

7、js框操作

8、隐式等待 implicitly Wait

9、显式等待 explicit Wait

10、Cookie操作

11、截图

12、窗口与导航

13、执行js

14、RemoteWebDriver与Grid简介

15、具体代码示例


前言:

示例

DEMO:

System.setProperty("webdriver.chrome.driver", "D:/developkit/driver/chromedriver.exe"); 
WebDriver driver=new ChromeDriver(); 
driver.get("http://www.baidu.com"); 
driver.findElement(By.id("kw1")).sendKeys("Selenium");

支持的浏览器驱动:ChromeDriver, EdgeDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, SafariDriver

 

最全Jar包下载:https://download.csdn.net/download/MonkeySun123321/12412733

代码示例在文章最后。

 

1、获取WebElement/WebElements

方法

说明

举例

调用

By.id

通过id查找

ttttttt

driver.findElement(By.id("msg"))

By.linkText

通过链接文字查找

百度

driver.findElement(By.linkText("百度"))

By.partialLinkText

通过部分链接文字查找

百度

driver.findElement(By.partialLinkText("百"))

By.name

通过name查找

tttttttt

driver.findElement(By.name("myname"))

By.tagName

通过标签名查找

tttttttt

driver.findElement(By.tagName("p"))

By.xpath

通过xpath查找

ttttttt

driver.findElement(By.xpath("/p"))

By.cssName

通过css名查找

ttttttt

driver.findElement(By.cssName("normal-text"))

By.cssSelector

通过css选择器查找

ttttttttt

driver.findElement(By.cssSelector("#msg"))

 

cssSelector的说明:http://www.w3school.com.cn/cssref/css_selectors.asp

xpath的说明:http://www.w3school.com.cn/xpath/index.asp

 

 

2、WebElement常用方法:

 返回值

 方法名

 说明

 void

 clear()

如果找到的元素是input 或  textarea,则清除它的值。其他元素不受影响。 

 void 

 click()

点击一个元素,元素必须可见,并且宽高都必须大于0。如果这个点击操作导致页面刷新的话,

必须要抛弃这个元素的所有引用,并且对这个元素的进一步操作,

都会引发StaleElementReferenceException

 String

 getAttribute(String name) 

通过属性名,获得属性值。例如,我想获得value的值,可以调用getAttribute("value")

 String

 getCssValue(String propertyName)

通过属性名,获得Css属性值,例如getCSSValue("height")

 String

 getTagName()

获得该元素的标签名,例如input,p等

 String

 getText()

获取页面上可见的文字(没有被css隐藏),包括子元素,获得的文本去除任何前导或后置的空格。

例如,html源码是

    aaaaa
bbbbb
   cccccc   

如果我们得到的WebElement ele=driver.findElement(By.id("test")),那么ele.getText()实际输出

aaaaa

bbbbb

cccccc

 boolean

 isDisplayed()

判断该元素是否可见。

 boolean

 isEnabled()

判断元素是否可用。

 boolean

 isSelected()

判断元素是否被选中,只用于单选或者多选按钮(radio button,check box)

 void

 sendKeys(CharSequence... keys)

模拟输入字符

 void 

 submit()

如果当前元素是一个form或者是在form内的一个元素,则会提交表单。

否则,引发NoSuchElementException

 

3、driver.get()和driver.navigate().to()到底有什么不同?

 

ChromeDriver extends RemoteWebDriver, FirefoxDriver extends RemoteWebDriver,还有其他driver均是继承自RemoteWebDriver,而RemoteWebDriver  implements WebDriver ,WebDriver是一个接口。关键在于RemoteWebDriver这个类。

 

 

navigate().to()实际是在调用get(url),可见driver.navigate().to()和driver.get()是一模一样的的,说起来,driver.get()还要比navigate().to()快那么一点点

 

 

4、下拉菜单(Select)的操作(不常用)

 

方法

说明

void deselectAll()

取消所有选择项,仅对下拉框的多选模式有效,若下拉不支持多选模式,则会抛出异常 UnsupportedOperationException(不支持的操作)

void deselectByIndex(int index)

取消指定index的选择,index从零开始,仅对多选模式有效,否则抛出异常 UnsupportedOperationException(不支持的操作)

void deselectByValue(String value)

取消Select标签中,value为指定值的选择,仅对多选模式有效,否则抛出异常 UnsupportedOperationException(不支持的操作)

void deselectByVisibleText(String Text)

取消项的文字为指定值的项,例如指定值为Bar,项的html为 ,仅对多选模式有效,单选模式无效,但不会抛出异常

ListgetAllSelectedOptions() 

获得所有选中项,单选多选模式均有效,但没有一个被选中时,返回空列表,不会抛出异常

WebElement getFirstSelectedOption() 

获得第一个被选中的项,单选多选模式均有效,当多选模式下,没有一个被选中时,会抛出NoSuchElementException异常

ListgetOptions() 

获得下拉框的所有项,单选多选模式均有效,当下拉框没有任何项时,返回空列表,不会抛出异常

boolean isMultiple() 

判断下拉框是否多选模式

void selectByIndex(int index)

选中指定index的项,单选多选均有效,当index超出范围时,抛出NoSuchElementException异常

void selectByValue(String value)

选中所有Select标签中,value为指定值的所有项,单选多选均有效,当没有适合的项时,抛出NoSuchElementException异常

void selectByVisibleText(String text)

选中所有项的文字为指定值的项,与deselectByValue相反,但单选多选模式均有效,当没有适合的项时,抛出NoSuchElementException异常

 

总结:select开头的,单选多选均有效;deselect开头的,仅对多选模式有效;返回选中项的,单选多选均有效,返回List的不会抛出异常。

 

5、Selenium窗口切换

切换的方法有两个,一个是通过窗口标题来验证,另一个是通过窗口特定的内容来验证,这两个方法都要求得到的标题或内容是唯一的。

用到的相关方法有:

方法

说明

String getTitle()

返回当前窗口的标题

String getPageSource()

获取最后加载页面的源。如果页面在加载后被修改(例如,由JavaScript),则不能保证返回的文本是修改过的页面。

String getWindowHandle()

获得能唯一标识该驱动实例的句柄

Set getWindowHandles()

获得一组句柄,可用来遍历所有打开的窗口

WebDriver switchTo().window(String nameOrHandle)

切换到指定窗口,如果窗口不存在,则抛出异常 NoSuchWindowException 

 

6、Selenium框架切换

切换框架:是指切换html中的iframe标签元素或者frame标签元素,注意,并不包括frameset

以下是常用的方法:

方法

说明

WebDriver switchTo().frame(int index)

通过索引切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException

WebDriver switchTo().frame(String nameOrId)

通过框架的name或者id切换到指定的框架,若框架不存在,则抛出异常 NoSuchFrameException

WebDriver switchTo().frame(WebElement frameElement)

通过元素定位切换到该框架。若元素不稳定,则抛出StaleElementReferenceException,若框架不存在,则抛出NoSuchFrameException

WebDriver switchTo().parentFrame()

切换到父级框架,如果当前框架是最顶级,则不会切换。

WebDriver switchTo().defaultContent()

返回到最顶级的主文档,官方还说了一种可能,就是返回第一个框架,但我暂时未找到这个例子。

 

7、js框操作

js框,就是JavaScript中的警告框(alert),确认框(confirm),提示框(prompt)

Selenium中对js框的操作非常简单,js框在Selenium中被抽象成Alert对象,只有四个方法:   void accept() :点击“确定”按钮   void dismiss() :点击“取消”按钮   Stirng getText() :获得窗口的提示信息   void sendKeys(String keysToSend) :在提示框中输入文档 在操作这些框前,当然需要先切换到他们,所以还需知道一个方法:   Alert switchTo().alert() :切换到js框,并且返回一个Alert对象

 

8、隐式等待 implicitly Wait

driver.manage().timeouts().implicitlyWait (long time, java.util.concurrent.TimeUnit unit) * time:等待的时间长度 *    unit:等待的时间单位,例如秒

当一个元素不能马上呈现时,指定driver应该等待的时间。若是单个元素的查找,driver会搜索整个页面,直到元素找到或者超过指定的时间。当超过指定时间仍未找到,则会抛出 NoSuchElementException异常。若是查找多个元素,driver会搜索整个页面,直到至少一个元素找到或者超过指定的时间。

  应明智的设置等待时间,因为设置不当,会对测试运行时造成不好的影响。特别是在使用XPath这类比较慢的定位策略时,尤其需要合理使用。

  简单说:如果查找单个元素,找到则马上停止,如果超过指定时间都没找到就抛出找不到的异常。如果查找多个元素,则会在指定时间内尽量查找,但不保证能找到所有。之所以要明智设置等待时间,因为这个方法对于driver来说是全局性的,每次这个driver去查找元素,都会遵循上面的方法。

 

  • 多次设置等待时间,是以最后一次设置为准,并非以最小等待时间或最大等待时间为准。
  • 这个全局设置是当前实例driver独有的,如果你此时新实例化了另一个driver2,那么

driver2的隐式等待与driver无关

 

9、显式等待 explicit Wait

显式等待,其实就是在使用WebDriverWait这个对象,进行等待。显式等待对比隐式等待,多了一些人性化的设置,可以说是更细化的隐式等待。

  WebDriverWait 类继承自泛型类 FluentWait ,而这个泛型类,又是泛型接口 Wait 的实现。Wait这个泛型接口只有一个方法,就是until,这也是我们需要重点掌握的方法,而FluentWait实现了until方法,而且还扩充了一些设置,例如,设置等待时间,每隔多少时间执行一次,执行过程中哪些异常可以忽略,以及超时的时候显示的信息。同样,WebDriverWait既然继承了FluentWait,也会拥有一样的方法。

 

首先,我们如何得到WebDriverWait的实例呢,他的构造函数有3个。

1.WebDriverWait(WebDriver driver, Clock clock, Sleeper sleeper, long timeOutInSeconds, long sleepTimeOut) 

     driver:这个不用说,大家都应该知道。

     clock:Clock是一个接口,clock参数是用来定义超时,一般使用默认即可。关于更详细的Clock

接口,可以点击这里

          sleeper:Sleeper也是一个接口,sleeper这个参数是,让当前线程进入睡眠的一个对象

     timeOutInSeconds:超时的时间,单位是秒

     sleepTimeOut:线程睡眠的时间,默认是500毫秒,也就是默认500毫秒执行一次

  2.WebDriverWait(WebDriver driver, long timeOutInSeconds)

       3.WebDriverWait(WebDriver driver, long timeOutInSeconds, long sleepInMillis)

 

现在我们得到了WebDriverWait对象,怎么实现等待呢。刚说了,until是当中最重要的一个方法,我们看看WebDriverWait中这个until方法的定义。

  public  V until(java.util.function.Function  isTrue) ,

  until方法中的参数是一个Function,其中? super WebDriver是参数,表示包括WebDriver在内的所有WebDriver的父类,V是返回值的类型。

 

until的参数 ExpectedConditions里面的方法

http://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html

public void testExplicitWait() { try { //driver.get("http://www.cnblogs.com"); driver.get("file:///E:/gitHub/study-self/javase/java/src/selenium/html/wait.html"); //定义超时4秒,默认每500毫秒轮询一次 WebDriverWait wait=new WebDriverWait(driver,4); //重新定义轮询时间,每隔1秒轮询一次 wait.pollingEvery(1000, TimeUnit.MILLISECONDS); //忽略NoSuchElementException异常 wait.ignoring(NoSuchElementException.class); //等待直到标题包含博客园 //wait.until(ExpectedConditions.titleContains("博客园")); //等待直到元素可点击 //wait.until(ExpectedConditions.elementToBeClickable(By.linkText("找找看"))); //等待直到url包含cnblogs.com //wait.until(ExpectedConditions.urlContains("cnblogs.com")); // visibilityOfElementLocated 用于检查某个元素是否出现在页面的DOM上并且可见的期望。可见性意味着不仅显示元素,而且元素的高度和宽度也大于0 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inputID"))).sendKeys("hello,selenium"); //等待4秒,每隔1秒定位一次,直至超时或返回要找的元素 /* WebElement ele = wait.until(arg0 -> { return arg0.findElement(By.linkText("找找看")); }); ele.click();*/ } catch (Exception e) { System.out.println("查找元素超时"); } }

 

10、Cookie操作

Selenium操作cookie非常简单,操作的方法主要有:

返回类型

方法和说明

void

addCookie(Cookie cookie) 添加一个cookie

void

deleteAllCookies() 删除当前域名下的所有cookie

void

deleteCookie(Cookie cookie) 删除一个cookie

void

deleteCookieNamed(java.lang.String name) 

删除一个cookie,参数是cookie名

Cookie

getCookieNamed(java.lang.String name) 通过名字得到cookie

java.util.Set

getCookies() 获得当前域名下的所有cookie

 

 

11、截图

ChromeDriver等各类浏览器的driver都继承自RemoteWebDriver,而RemoteWebDriver实现了TakesScreenshot接口,换言之,我们常用的各种driver,ChromeDriver, EdgeDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, SafariDriver,既实现了WebDriver接口,也实现了TakesScreenshot接口,因此我们可以像使用WebDriver接口一样,使用TakesScreenshot。而TakesScreenshot接口只有一个方法:

 X getScreenshotAs(OutputType target) throws WebDriverException

 因此,我们可以这样使用: 

//截图作为文件保存 
File screenshotFile =((TakesScreenshot)driver).getScreenshotAs (OutputType.FILE); 
//将图片存为base64 
String screenshotBase64 = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BASE64);

 

公共接口OutputType (定义屏幕截图的输出类型。)

修饰符和类型

栏位及说明

static OutputType

BASE64

获取屏幕截图作为base64数据。

static OutputType

BYTES

以原始字节获取屏幕截图。

static OutputType

FILE

将屏幕快照获取到一个临时文件中,一旦JVM退出,该文件将被删除。

 

而FileHandler,提供了一些静态方法,满足我们常用的文件操作需要,例如

//将一个文件复制到另一个地方 static void copy(java.io.File from, java.io.File to)

 

 

公共类FileHandler ,扩展java.lang.Object(常见文件系统活动的实用程序方法)

修饰符和类型

方法和说明

static void

copy(java.io.File from, java.io.File to) 

static void

copyResource(java.io.File outputDir, java.lang.Class forClassLoader, java.lang.String... names) 

static boolean

createDir(java.io.File dir) 

static boolean

delete(java.io.File toDelete) 

static boolean

isZipped(java.lang.String fileName) 

static boolean

makeWritable(java.io.File file) 

 

12、窗口与导航

 

 一。窗口,也就是window,这里的窗口是指浏览器窗口。他的方法主要有:

返回类型

方法说明

void

fullscreen() 将当前浏览器窗口最大化

Point

getPosition() 获得浏览器左上角位置

Dimension

getSize() 获得当前窗口的大小

void

maximize() 将当前窗口最大化

void

setPosition(Point targetPosition) 设置窗口的位置

void

setSize(Dimension targetSize) 设置窗口的大小

 

二。而导航,也是非常简单,就是控制窗口的前进,后退,刷新等。方法主要有:

返回类型

方法说明

void

back() 后退

void

forward() 前进

void

refresh() 刷新

void

to(java.lang.String url) 跳转到指定url

void

to(java.net.URL url) 跳转到指定url

三。driver.quit和driver.close到底有什么不同

  官方的说明是:

  driver.close:Close the current window, quitting the browser if it's the last window currently open.(关掉最后一个打开的窗口)

  driver.quit:Quits this driver, closing every associated window.(关掉所有相关的窗口)

 

13、执行js

Selenium能够执行js,这使得Selenium拥有更为强大的能力。既然能执行js,那么js能做的事,Selenium应该大部分也能做。这应该得益于JavascriptExecutor这个接口,而ChromeDriver, EdgeDriver, EventFiringWebDriver, FirefoxDriver, InternetExplorerDriver, OperaDriver, RemoteWebDriver, SafariDriver均实现了这个接口。跟使用WebDriver一样,我们可以这样使用该接口: 

WebDriver driver=new ChromeDriver(); JavascriptExecutor jsExecutor=(JavascriptExecutor) driver;

  该接口十分简单,只有两个方法:

  1.java.lang.Object executeScript(java.lang.String script, java.lang.Object... args)   同步执行js

  2.java.lang.Object executeAsyncScript(java.lang.String script, java.lang.Object... args)  异步执行js

  对于返回值:

  1.如果js返回的是html元素,那么方法返回WebElement

  2.如果js返回的是小数,方法返回Double

  3.如果js返回的是非小数,方法返回Long

  4.如果js返回的是布尔,方法返回Boolean

  5.如果js返回的是其他,方法返回String

  6.如果js返回的是数组,方法返回List,可以嵌套,Object的值的类型是根据上面5条而定。

  7.如果js返回的是map,方法返回Map,Object值类型的定义同上。

  8.如果js返回null或没有返回,方法返回null

 

  对于 arg参数:

  js会用一个“魔法”变量arguments来接收。参数的类型可以是:数字,布尔,字符串,元素(WebElement)以及List,Object类型为上述类型

 

14、RemoteWebDriver与Grid简介

 

 

15、具体代码示例:

package selenium;

import org.junit.Test;
import org.openqa.selenium.*;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.io.FileHandler;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.support.ui.WebDriverWait;
import util.CollectionUtil;
import util.JacksonUtil;

import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * 
 *       Selenium入门
 * 
* * @author zhaominglei * @version 1.00.00 *
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * 
*/ public class SeleniumTest { static WebDriver driver = null; static { // 指定驱动位置,加载并创建driver对象 System.setProperty("webdriver.chrome.driver", "D:/developkit/driver/chromedriver.exe"); driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); } /** * 1、元素定位 * 2、获取WebElement (findElement/findElements) */ @Test public void testElementLocator() { // driver.get("http://www.baidu.com"); driver.navigate().to("http://www.baidu.com"); // By.Id driver.findElement(By.id("kw")).sendKeys("Selenium"); // By.name WebElement description = driver.findElement(By.name("description")); System.out.println(description.getAttribute("content")); // By.className WebElement element = driver.findElement(By.className("s-top-wrap")); List elements = driver.findElements(By.className("s-top-wrap")); System.out.println(element.getAttribute("id")); for (WebElement e : elements) { System.out.println("Elements " + e.getAttribute("id")); } // By.partialLinkText System.out.println(driver.findElement(By.partialLinkText("贴吧")).getText()); // By.cssSelector System.out.println(driver.findElement(By.cssSelector("#s-top-left > a:nth-child(2)")).getAttribute("href")); // By.xpath System.out.println(driver.findElement(By.xpath("//*[@id=\"s-top-left\"]/a[2]")).getAttribute("href")); } /** * 3、WebElement使用及常用方法 */ @Test public void testElementApi() { try { /* * 隐式等待,implicitlyWait()方法比sleep()方法智能,sleep()/*方法只能在一个固定的时间等待, * 而implicitlyWait()可以在一个时间范围内等待,称为隐式等待 */ driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS); driver.get("https://e.mail.sh.cn/"); //窗口最大化 driver.manage().window().maximize(); // sendKey clear WebElement uid = driver.findElement(By.id("uid")); //账号 WebElement password = driver.findElement(By.id("password")); uid.sendKeys("Selenium"); uid.clear(); // click driver.findElement(By.id("languageName")).click(); driver.findElement(By.cssSelector("#mainRCommon > div > div.Header > div.select_options.localePanel > ul > a:nth-child(2) > li > span")).click(); // 方法1,强制等待,固定休眠时间设置,sleep()方法以毫秒为单位 ,此类为设置5s等待 Thread.sleep(1000); // sendKey driver.get("https://e.mail.sh.cn/?cus=1"); uid = driver.findElement(By.id("uid")); //账号 password = driver.findElement(By.id("password")); uid.sendKeys("zml"); password.sendKeys("123321"); // submit不生效 使用click driver.findElement(By.id("login_button")).click(); String text = driver.findElement(By.xpath("//*[@id=\"logArea\"]/div[3]/span")).getText(); System.out.println("输出错误信息" + text); } catch (Exception e) { System.out.println(e); } finally { driver.close(); } } /** * 4、下拉菜单(Select)的操作(不常用) */ @Test public void testSelectedOption() { try { //转到我们刚才编写的html driver.get("E:/gitHub/study-self/javase/java/src/selenium/select.html"); driver.manage().window().maximize(); //找到下拉框元素 WebElement element = driver.findElement(By.name("phones")); //转化为Select Select select = new Select(element); select.selectByValue("小米2"); //使用可见文字也可以 select.selectByVisibleText("中兴"); //使用index也可以 select.selectByIndex(0); } catch (Exception e) { e.printStackTrace(); } finally { driver.close(); } } /** * 5、Selenium窗口切换 driver.switchTo().window(windowHandle) * 1.通过句柄切换 * 2.通过标题切换 * 3.通过内容切换 */ @Test public void testWindowSwitch() { try { driver.get("https://www.jd.com/"); driver.manage().window().maximize(); String currentUrl = driver.getCurrentUrl(); String title = driver.getTitle(); String windowHandle = driver.getWindowHandle(); String pageSource = driver.getPageSource(); System.out.println("当前页面url " + currentUrl); System.out.println("当前页面title " + title); System.out.println("当前窗口句柄 " + windowHandle); //CDwindow-4C1D098F8E8FA747A5514BF97E15A845 //System.out.println("页面内容 " + pageSource); driver.findElement(By.xpath("//*[@id=\"J_cate\"]/ul/li[1]/a")).click(); Thread.sleep(2000); // 1、句柄方式 driver.switchTo().window(windowHandle); // 2、title方式 /*Set handles = driver.getWindowHandles(); for(String handler : handles){ if (driver.switchTo().window(handler).getTitle().equals(title)){ driver.switchTo().window(handler); break; } }*/ // 3、pageSource方式 /*Set handles = driver.getWindowHandles(); for (String handler : handles) { if (driver.switchTo().window(handler).getPageSource().contains("工业品")) { driver.switchTo().window(handler); break; } }*/ driver.findElement(By.partialLinkText("工业品")).click(); } catch (InterruptedException e) { e.printStackTrace(); } finally { driver.close(); // driver.quit(); } } /** * 6、Selenium框架切换(不常用) */ @Test public void testFrameSwitch() { try { driver.get("E:/gitHub/study-self/javase/java/src/selenium/html/frame.html"); Thread.sleep(1000); //切换到框架2,找到文本框,输入“frame2”,首次运行,焦点默认在主文档 driver.switchTo().frame(1); WebElement textFrame2 = driver.findElement(By.id("text1")); textFrame2.sendKeys("frame2"); Thread.sleep(1000); //切换到框架1,找到文本框狂,输入“frame1” //需要先切换到最顶端文档,否则会抛出异常,找不到该框架 driver.switchTo().defaultContent(); driver.switchTo().frame(0); WebElement textFrame1 = driver.findElement(By.id("text1")); textFrame1.sendKeys("frame1"); Thread.sleep(1000); //切换回最顶端文档,找到文本框,输入“main” driver.switchTo().defaultContent(); WebElement textMain = driver.findElement(By.id("text1")); textMain.sendKeys("main"); } catch (InterruptedException e) { e.printStackTrace(); } finally { driver.close(); } } /** * 7、js框操作 -----警告框(alert),确认框(confirm),提示框(prompt) */ @Test public void testJsAlert() { try { driver.get("file:///E:/gitHub/study-self/javase/java/src/selenium/html/jsAlert.html"); Thread.sleep(1000); driver.findElement(By.id("button1")).click(); Thread.sleep(1000); Alert alert = driver.switchTo().alert(); //alert.sendKeys("zml"); //提示框(prompt) System.out.println(alert.getText()); //alert.accept(); //确定 alert.dismiss(); } catch (Exception e) { e.printStackTrace(); } finally { //driver.close(); } } /** * 8、隐式等待 implicitly Wait * 查找元素隐式等待:调用driver.manage().timeouts().implicitlyWait(long time, java.util.concurrent.TimeUnit unit) * time:等待的时间长度 *    unit:等待的时间单位,例如秒 */ @Test public void testImplicitWait() { //设置隐式查找元素的等待时间是5秒 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); driver.get("http://www.cnblogs.com"); //计算查找博客园首页“找找看”链接元素的时间 Date startTime1 = new Date(); driver.findElement(By.linkText("找找看")); Date endTime1 = new Date(); long diff1 = endTime1.getTime() - startTime1.getTime(); System.out.println("找到连接元素‘找找看’所用的时间是:" + diff1 + "毫秒"); //故意让driver去查找一个不存在的元素aaa,看看它抛出异常的时间是否跟我们设置的5秒一样 Date startTime2 = new Date(); try { driver.findElement(By.id("aaa")); } catch (Exception e) { Date endTime2 = new Date(); long diff2 = endTime2.getTime() - startTime2.getTime(); System.out.println("抛出异常的时间间隔:" + diff2); } } /** * 9、显式等待 explicitly Wait */ @Test public void testExplicitWait() { try { //driver.get("http://www.cnblogs.com"); driver.get("file:///E:/gitHub/study-self/javase/java/src/selenium/html/wait.html"); //定义超时4秒,默认每500毫秒轮询一次 WebDriverWait wait = new WebDriverWait(driver, 4); //重新定义轮询时间,每隔1秒轮询一次 wait.pollingEvery(1000, TimeUnit.MILLISECONDS); //忽略NoSuchElementException异常 wait.ignoring(NoSuchElementException.class); //等待直到标题包含博客园 //wait.until(ExpectedConditions.titleContains("博客园")); //等待直到元素可点击 //wait.until(ExpectedConditions.elementToBeClickable(By.linkText("找找看"))); //等待直到url包含cnblogs.com //wait.until(ExpectedConditions.urlContains("cnblogs.com")); // visibilityOfElementLocated 用于检查某个元素是否出现在页面的DOM上并且可见的期望。可见性意味着不仅显示元素,而且元素的高度和宽度也大于0 wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("inputID"))).sendKeys("hello,selenium"); //等待4秒,每隔1秒定位一次,直至超时或返回要找的元素 /* WebElement ele = wait.until(arg0 -> { return arg0.findElement(By.linkText("找找看")); }); ele.click();*/ } catch (Exception e) { System.out.println("查找元素超时"); } } /** * 10、Cookie操作 * 1、用户名+密码+拖动滑块 登录 * 2、登录 * 3、获取cookie * 4、页面跳转 */ @Test public void testCookie() { try { driver.get("https://shanxi/login"); Thread.sleep(2000); clickOnHideButton(driver.findElement(By.id("login-btn"))); Thread.sleep(1000); WebElement block = driver.findElement(By.xpath("//*[@id=\"dxDrag\"]/div[2]")); block.click(); WebElement source = driver.findElement(By.xpath("//*[@id=\"dxDrag\"]/div[3]")); for (int i = 0; i < 5; i++) { move(driver, source); String text = block.getText(); System.out.println("滑动结果:" + text); if ("验证通过".equals(text)) { driver.findElement(By.xpath("//*[@id=\"nsrsbh\"]")).sendKeys("xxx"); driver.findElement(By.xpath("//*[@id=\"mm\"]")).sendKeys("ppp"); driver.findElement(By.xpath("//*[@id=\"dwnsrForm\"]/div/div[7]/button")).click(); System.out.println("登录成功"); clickOnHideButton(driver.findElement(By.xpath("//*[@id=\"top\"]/div[1]/ul/li[3]/a"))); Thread.sleep(1000); clickOnHideButton(driver.findElement(By.xpath("//*[@id=\"top\"]/div[2]/div[3]/ul/li[3]/a/img"))); Thread.sleep(1000); Set cookies = driver.manage().getCookies(); StringBuilder sb = new StringBuilder(); for (Cookie c : cookies) { System.out.println(c.getName() + " " + c.getValue()); sb.append(c.getName() + "=" + c.getValue() + ";"); } String cookie = sb.toString(); System.out.println("获取的cookie值为:" + cookie); String byForm = HttpRequestGetAndPostUtil.getByForm("https://shanxi/login", cookie); System.out.println(byForm); Map jsonMap = JacksonUtil.jsonToMap(byForm); List jsonList = CollectionUtil.getList(jsonMap, "message"); for (Object o : jsonList) { System.out.println(o); } break; } else { System.out.println("验证码破解失败"); continue; } } } catch (Exception e) { System.out.println("查找元素超时" + e.getMessage()); } } /** * 11、截图 */ @Test public void testScreenShot() { // 截图转换为base64 /*String base64 = ((TakesScreenshot) driver).getScreenshotAs(OutputType.BASE64); System.out.println(base64);*/ //截图转换为File格式 try { driver.get("https://www.hao123.com/"); WebDriverWait webDriverWait = new WebDriverWait(driver, 5); webDriverWait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id=\"search\"]/form/div[3]/input"))); File screenshotAs = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); File file = new File("C:/Rrr/temp2"); if (!file.exists()) { //file.mkdir(); FileHandler.createDir(file); } FileHandler.makeWritable(file); FileHandler.copy(screenshotAs, new File("C:/Rrr/temp2/" + UUID.randomUUID().toString() + ".png")); } catch (IOException e) { e.printStackTrace(); } } /** * 12、窗口与导航 window navigate */ @Test public void testWindowAndNavigate() { try { // 1.window /*driver.get("http://www.baidu.com"); Thread.sleep(2000); //最大化 driver.manage().window().maximize(); Thread.sleep(2000); //全屏 driver.manage().window().fullscreen(); Thread.sleep(2000); //打印当前位置,大小 System.out.println("当前位置:" + driver.manage().window().getPosition()); System.out.println("当前大小:" + driver.manage().window().getSize()); //重新设置窗口大小和位置 driver.manage().window().setSize(new Dimension(400, 300)); Thread.sleep(2000); driver.manage().window().setPosition(new Point(100, 100)); driver.quit();*/ //2、navigate driver.get("https://blog.csdn.net/"); Thread.sleep(1000); driver.findElement(By.xpath("//*[@id=\"nav\"]/div/div/ul/li[11]/a")).click(); Thread.sleep(2000); driver.navigate().back(); Thread.sleep(2000); try { driver.navigate().to(new URL("http://www.baidu.com")); Thread.sleep(2000); driver.navigate().refresh(); } catch (MalformedURLException e) { e.printStackTrace(); } } catch (InterruptedException e) { e.printStackTrace(); } } /** * 13、执行js */ @Test public void excuteJs() { try { driver.get("https://www.csdn.net/"); WebElement element = this.driver.findElement(By.xpath("//*[@id=\"nav\"]/div/div/ul/li[11]/a")); JavascriptExecutor jsDriver = (JavascriptExecutor) SeleniumTest.driver; //jsDriver.executeScript("alert(arguments[0])","111","222"); //String href = (String) jsDriver.executeScript("return document.getElementsByClassName(\"nav_com\")[0].getElementsByTagName('li')[10].getElementsByTagName('a')[0].getAttribute('href');"); String href = (String) jsDriver.executeScript("return arguments[0].getAttribute('href')", element); System.out.println("输出结果 " + href); } catch (Exception e) { e.printStackTrace(); } } /** * 移动滑块操作 * * @param driver * @param source */ public void move(WebDriver driver, WebElement source) { try { Actions action = new Actions(driver); action.clickAndHold(source).moveByOffset((int) (Math.random() * 1000) + 80, 0); //拖动完释放鼠标 action.moveToElement(source).release(); //组织完这些一系列的步骤,然后开始真实执行操作 Action actions = action.build(); actions.perform(); } catch (ElementNotVisibleException e1) { System.out.println("滑块元素不存在"); } catch (Exception e) { System.out.println("超时异常输出"); } } /** * 点击被覆盖的元素,防止异常报错 * * @param element */ public void clickOnHideButton(WebElement element) { JavascriptExecutor driver = (JavascriptExecutor) this.driver; driver.executeScript("arguments[0].click()", element); } }

 

 

 

 

 

 

你可能感兴趣的:(Selenium,java,selenium,xpath,其他)