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查找

<p id="msg">ttttttt</p>

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

By.linkText

通过链接文字查找

<a href="http://www.baidu.com">百度</a>

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

By.partialLinkText

通过部分链接文字查找

<a href="http://www.baidu.com">百度</a>

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

By.name

通过name查找

<p name="myname">tttttttt</p>

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

By.tagName

通过标签名查找

<p>tttttttt</p>

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

By.xpath

通过xpath查找

<p>ttttttt</p>

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

By.cssName

通过css名查找

<p class="normal-text">ttttttt</p>

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

By.cssSelector

通过css选择器查找

<p id="msg">ttttttttt</p>

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源码是<p id="test">    aaaaa <br/>bbbbb<br/><a href="#">   cccccc    </a></p>

如果我们得到的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为 <option value="foo">Bar</option>,仅对多选模式有效,单选模式无效,但不会抛出异常

List<WebElement>getAllSelectedOptions() 

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

WebElement getFirstSelectedOption() 

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

List<WebElement>getOptions() 

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

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

 

首先,我们如何得到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> V until(java.util.function.Function<? super WebDriver,V>  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<Cookie>

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

 

 

11、截图

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

<X> X getScreenshotAs(OutputType<X> target) throws WebDriverException

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

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

 

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

修饰符和类型

栏位及说明

static OutputType<java.lang.String>

BASE64

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

static OutputType<byte[]>

BYTES

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

static OutputType<java.io.File>

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这个接口,而ChromeDriverEdgeDriverEventFiringWebDriverFirefoxDriverInternetExplorerDriverOperaDriverRemoteWebDriverSafariDriver均实现了这个接口。跟使用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>,可以嵌套,Object的值的类型是根据上面5条而定。

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

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

 

  对于 arg参数:

  js会用一个“魔法”变量arguments来接收。参数的类型可以是:数字,布尔,字符串,元素(WebElement)以及List<Object>,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;

/**
 * <pre>
 *       Selenium入门
 * </pre>
 *
 * @author zhaominglei
 * @version 1.00.00
 * <pre>
 * 修改记录
 *    修改后版本:     修改人:  修改日期:     修改内容:
 * </pre>
 */
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<WebElement> 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<String> handles = driver.getWindowHandles();
            for(String handler : handles){
                if (driver.switchTo().window(handler).getTitle().equals(title)){
                    driver.switchTo().window(handler);
                    break;
                }
            }*/
            // 3、pageSource方式
            /*Set<String> 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<Cookie> 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<String, Object> jsonMap = JacksonUtil.jsonToMap(byForm);
                    List<Object> 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学习笔记。以下是一份简单的学习笔记供参考: Selenium学习笔记 Selenium是一款用于自动化Web应用程序测试的强大工具。它提供了一组丰富的API,可以与各种编程语言(如Python、Java、C#等)结合使用,以实现Web应用程序的自动化测试。 1. 安装和配置 首先,你需要安装Selenium库。如果你使用Python,可以使用以下命令安装: ``` pip install selenium ``` 安装完成后,你还需要下载并配置相应的浏览器驱动程序。Selenium支持各种浏览器,如Chrome、Firefox、Safari等。你可以在Selenium官方网站上找到相应的驱动程序下载链接。 2. 基本操作 Selenium提供了一系列方法来模拟用户在浏览器中的操作,如打开URL、点击元素、输入文本等。以下是一些常用的基本操作示例: - 打开浏览器并访问URL: ```python from selenium import webdriver driver = webdriver.Chrome() # 使用Chrome浏览器驱动 driver.get("https://www.example.com") # 打开指定URL ``` - 查找元素并操作: ```python element = driver.find_element_by_id("element_id") # 根据元素ID查找 element.click() # 点击元素 input_element = driver.find_element_by_name("input_name") # 根据元素名称查找 input_element.send_keys("Hello, World!") # 输入文本 ``` - 执行JavaScript代码: ```python driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 滚动到页面底部 ``` 3. 高级操作 Selenium还提供了一些高级操作,如处理弹窗、切换窗口、等待元素加载等。以下是一些常用的高级操作示例: - 处理弹窗: ```python alert = driver.switch_to.alert # 切换到弹窗 alert.accept() # 接受弹窗 confirm = driver.switch_to.alert # 切换到确认框 confirm.dismiss() # 取消确认框 ``` - 切换窗口: ```python window_handles = driver.window_handles # 获取所有窗口句柄 driver.switch_to.window(window_handles[-1]) # 切换到最后一个窗口 ``` - 等待元素加载: ```python from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "element_id")) ) ``` 4. 测试框架 Selenium还可以与测试框架(如Pytest、JUnit等)结合使用,以便更好地组织和管理测试用例。你可以使用测试框架提供的断言方法来验证测试结果。 ```python import pytest def test_example(): driver = webdriver.Chrome() driver.get("https://www.example.com") assert "Example Domain" in driver.title # 断言页面标题包含指定文本 driver.quit() ``` 以上是一份简单的Selenium学习笔记,希望对你有所帮助。当然,Selenium还有很多其他功能和用法,你可以进一步深入学习和探索。祝你学习愉快!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值