Selenium3 浅尝

1.下载

网址:http://www.seleniumhq.org/download/
根据自己的语言,下载正确的版本,由于本人是java出身,python还只是入门级别,所以不班门弄斧,下面的所有diamante均基于
java.由于写博客时候已经是3的版本了,所以就以3的版本来讲。
下载完包以后,解压出来即可。

2.Selenium模拟登陆

新建java项目,将上面解压出来的包里的jar都放进项目中build path。(太基础了,不多讲了)
以代码讲:
    java
    public static void main(String[] args){
        /*
        创建环境变量,即浏览器执行程序,这里一定要注意,下载驱动的时候,根据自己的浏览器版本下载,我的chrom浏览器是51
        版本的,所以下载的是2.22版本,。附上下载地址:
        http://chromedriver.storage.googleapis.com/index.html
        不知道下载那个版本,就随便进一个,看看他的notes.txt文件,里面有说版本
        */
        System.setProperty("webdriver.chrome.driver", 
            "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
        /*根据环境变量,可以获取到chrom的驱动*/
        ChromeDriver chromeDriver = new ChromeDriver();
        //前往页面,下面的页面是10086云的一个登录页,姑且拿来使用
        chromeDriver.get("https://ecloud.10086.cn:31015/op-user-sso/login?
            service=https%3A%2F%2Fecloud.10086.cn%3A31015%2Flogin%2Fcas");
        //有点类似于与jquery获取页面元素
        WebElement username = chromeDriver.findElement(By.id("username"));
        username.sendKeys("里面写用户名");
        //密码
        WebElement password = chromeDriver.findElement(By.id("password"));
        password.sendKeys("里面写密码");
        //找到提交按钮
        WebElement btn = chromeDriver.findElement(By.name("submit"));
        //点击提交
        btn.click();
        //关闭浏览器
        chromeDriver.close();
    } 

3.WebDriver API

从selenium2就有了,功能强大,反正比selenium-RC强。

3.1Selenium-WebDriverAPI命令和操作:

3.1.1 操作页面:

我们使用selenium的最想做的事,就是模拟用户能操作真实的页面。最简单的操作一个页面的方式就是get()方法。例如:
chromDriver.get("http://www.baidu.com")

3.1.2定位元素(WebElements)

WebDriver提供了八种元素定位:
chromDriver.findElementById(id)                     
chromDriver.findElement(By.id("id"))               
    最常用的,也不容易出错
chromeDriver.findElementByClassName(className);     
chromDriver.findElement(By.className(className))       
    一般是使用findElements时候回使用className来做条件 
chromeDriver.findElementByCssSelector(using);

chromeDriver.findElementByLinkText(using);          
chromDriver.findElement(By.linkText(linkText))               
    针对a标签的,用a标签内的展示名做查询,例如:
        <a href="www.baidu.com">百度一下</a>
        <a href="www.chrom.com">谷歌一下</a>
    那么我们可以chromDriver.findElementByLinText("百度一下");
chromeDriver.findElementByName(using)               
chromDriver.findElement(By.name(name))          
    也比较常用,根据页面元素的name属性查找
chromeDriver.findElementByPartialLinkText(using)    
chromDriver.findElement(By.partialLinkText(linkText))
    类似于findElementByLinkText,不过他针对的是内容太长的时候,例如:
        <a href="www.baidu.com">百度一下下下下下下下下下下下下下下下下下下下下</a>
        <a href="www.chrom.com">谷歌一下下下下下下下下下下下下下下下下下下下下</a>
    那么我们可以chromeDriver.findElementByPartialLinkText("百度")  
chromeDriver.findElementByTagName(using)    
chromDriver.findElement(By.tagName(tagName))         
    根据标签的类型,比较不准确,看具体使用场景
chromeDriver.findElementByXPath(using)
chromDriver.findElement(By.Xpath(Xpath))
    Xpath的形式太过于强大,所以之后单独留一部分讲吧。

3.1.3 获取元素的文本值:

例如:<a id="my" href="www.baidu.com">百度一下</a>
    File f = new File("D:/hello.html");
    System.setProperty("webdriver.chrome.driver", 
        "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(f.getAbsolutePath());
    String text = chromeDriver.findElement(By.id("my")).getText();
    System.out.println(text);

3.1.4 下拉菜单选择:

例如:页面为      
<select>
  <option value ="1">1</option>
  <option value ="2">2</option>
  <option value ="3">3</option>
  <option value ="4">4</option>
</select>   
测试程序:
    WebElement select = chromeDriver.findElement(By.tagName("select"));
    List<WebElement> allOptions = select.findElements(By.tagName("option"));
    for (WebElement option : allOptions) {
         System.out.println(String.format("Value is: %s", option.getAttribute("value")));
         option.click();
        }
当然,WebDriver也提供了封装函数:
    Select ss = new Select(chromeDriver.findElement(By.tagName("select")));
        if(ss.isMultiple()){
            System.out.println("多选");
            ss.deselectAll();//表示全选
            ss.selectByVisibleText("1");//表示选指定的option
        }

3.1.5 window窗口或者iframe切换

iframe切换
①单层嵌套iframe
<a href="http://www.baidu.com" target="myIframe">Look</a>
<iframe height="1000" width="1000" name="myIframe"></iframe>
java代码
    File f = new File("D:/hello.html");
        System.setProperty("webdriver.chrome.driver", 
            "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get(f.getAbsolutePath());
    //点击a标签
    WebElement a = chromeDriver.findElement(By.linkText("Look"));
    a.click();
    //获取iframe中的元素
    WebElement iframe = chromeDriver.switchTo().frame(target).findElement(By.id("su");
    String value = iframe.getAttribute("value")
    //结果就是“百度知道”
    //但是这时我们是处于iframe中,并不是处于原来的hello.html中,再操作原来的页面的元素,就会空指针,或者
    //org.openqa.selenium.NoSuchElementException这个报错。
    //我们可以使用chromeDriver.switchTo().defaultContent()回到原来的页面hello.html
    chromeDriver.switchTo().defaultContent();
②多层嵌套
selenium提供了:
chromeDriver.switchTo().parentFrame();
它可以从当前iframe退回到上一层iframe,如果当前已经是根文件了,那么就无效
不过我们也是可以继续使用上述的:
chromeDriver.switchTo().frame(target)
来指定所希望跳转到的iframe标识。

多窗口切换:
getWindowHandle() 获得当前窗口句柄
getWindowHandles() 返回的所有窗口的句柄到当前会话
switchTo().window() 用于切换到相应的窗口,与switchTo().frame()是类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。

3.1.6 弹出对话框等警告框

具体的做法就是首先stitchTo,然后定位到适当的操作上,例如alert/confirm/prompt,例如:
Alert alert = driver.switchTo().alert();
然后对于获取到的对象进行 text/accept/dismiss/sendKeys等操作,但是不能瞎写

3.1.7 控制浏览器的前进和后退

//后退
driver.navigate().back();
//前进
driver.navigate().forward();
其实访问页面时候我们调用的get方法也是navigate锁可以实现的功能,而且二者都是完成一样的功能,唯一不同的就是,写的方式不同
driver.get("www.baidu.com")
driver.navigate.get("www.baidu.com")
//下面的是刷新页面,类似于F5
driver.navigate().refresh();

这个方法用于刷新页面。

3.1.8 Cookies

直接上代码吧
    登录的就不写了,本业最顶上就有个。
    Set<Cookie> cookies = chromeDriver.manage().getCookies();
    cookies.stream().forEach((Cookie c)->{
            System.out.println(c.getName() + " : " + c.getValue());
    });
    //添加cookie
    chromeDriver.manage().addCookie(new Cookie("键","值"));
    //删除cookie,一共三种方法:
    ①By name
    driver.manage().deleteCookieNamed("CookieName");
    ③Cookie
    driver.manage().deleteCookie(Cookie对象);
    ③Or all of them
    driver.manage().deleteAllCookies();

3.1.9 改变用户代理(知道有这个东西就好了)

FirefoxProfile profile = new FirefoxProfile();
profile.addAdditionalPreference("general.useragent.override", "some UA string");
WebDriver driver = new FirefoxDriver(profile);

3.1.10 鼠标事件(包含元素的拖拽,右键,悬停等操作)

鼠标事件可以分为如下的:
 contextClick() 右击
 clickAndHold() 鼠标悬停
 move_to_element() 鼠标悬停
 doubleClick() 双击
 dragAndDrop() 拖动
 release() 释放鼠标
 perform() 执行所有 Actions 中存储的行为
①右击
Action action = new Action(chromDriver);
action.contextClick(WebElement).perform() ---入参就是要被执行右击的元素

②悬停
Action action = new Action(chromDriver);
action.clickAndHold(WebElement).perform()
dragAndDrop函数的第一个参数标识起始位置,第二个参数是目标位置
③鼠标的拖拽
WebElement element = driver.findElement(By.name("source"));
WebElement target = driver.findElement(By.name("target"));
(new Actions(driver)).dragAndDrop(element, target).perform();
④释放鼠标
用于释放鼠标事件
其他的不做介绍了

3.1.11 键盘事件

    System.setProperty("webdriver.chrome.driver", "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get("http://www.baidu.com");
    WebElement input = chromeDriver.findElement(By.id("kw"));
    input.sendKeys("piemon");
    //输入一个空行
    input.sendKeys(Keys.SPACE);
    //回退格,就像删除键
    input.sendKeys(Keys.BACK_SPACE);
    //全部选定与剪切复制
    input.sendKeys(Keys.CONTROL,"a");
    input.sendKeys(Keys.CONTROL,"x");
    input.sendKeys(Keys.CONTROL,"v");
    //提交
    //通过回车键盘来代替点击操作
    input.sendKeys(Keys.ENTER);
其他的还有:
    sendKeys(Keys.F1) ----F1只是样例

3.1.12 获得验证信息

getTitle() 用于获得当前页面的标题。
getCurrentUrl() 用户获得当页面的 URL。
getText() 用于获取元素的文本信息。
一些我们可能用到的数据方法

3.1.13 浏览器窗口大小控制和浏览器相对屏幕的位置

//设置页面的大小,全屏可以使用maximize()方法
driver.manage().window().setSize(new Dimension(361, 361));
//设置页面的相对位置
chromeDriver.manage().window().setPosition(new Point(100, 100));

3.1.14 简单元素操作

 clear() 清除文本,如果是一个文件输入框
 sendKeys(*value) 在元素上模拟按键输入
 click() 单击元素
常用的一些其他方法:
    submit()
    submit只要是来提交我们表单的,但是有时我们的页面上输入框输入值以后回车就进行了提交,也是可以使用submit的,下面我们一baidu的主页
    做测试
```java
    System.setProperty("webdriver.chrome.driver", 
        "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
    ChromeDriver chromeDriver = new ChromeDriver();
    chromeDriver.get("http://www.baidu.com");
    WebElement keyWord = chromeDriver.findElement(By.id("kw"));
    keyWord.sendkeys("java");
    keyWord.submit();
```
有些时候 submit()可以与 click()方法互换来使用,submit()同样可以提交一个按钮.
        System.setProperty("webdriver.chrome.driver", 
                "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
        ChromeDriver chromeDriver = new ChromeDriver();
        chromeDriver.get("http://www.baidu.com");
        WebElement keyWord = chromeDriver.findElement(By.id("kw"));
        keyWord.sendKeys("hero");
        WebElement submit = chromeDriver.findElement(By.id("su"));
        submit.submit(); //这里也可以用submit.click()

 getSize() 返回元素的尺寸。
 getAttribute(name) 获得属性值。
 isDisplayed() 设置该元素是否用户可见。

3.1.15 设置元素等待

WebDriver 提供了几种方法来等待元素
 implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常
 setScriptTimeout。异步脚本的超时时间。webdriver 可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间
 pageLoadTimeout。页面加载时的超时时间。因为 webdriver 会等页面加载完毕在进行后面的操作,所以如果页面在这个超时时间内没有加载完
  成,那么 webdriver 就会抛出异常
程序的休眠,即线程sleep
但是sleep是由java源码提供,即手动调用Thread.sleep(2000);

3.1.16 上传文件

①sendKeys上传
针对form表单提交文件的操作,例如:
<form action"/upload" method="post">
    上传:<input type="file" value="upload" id="upload" />
    <input type="submit" value="提交" id="submit">
</form>
    chromeDriver.findElement(By.id("upload")).sendKeys("这里写个上传的文件的全路径")
    chromeDriver.findElement(By.id("submit")).click();

3.1.17 文件下载

System.setProperty("webdriver.chrome.driver", "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
ChromeDriver chromeDriver = new ChromeDriver();
chromeDriver.get("http://start.spring.io/");
chromeDriver.findElement(By.name("generate-project")).click();

3.1.18 调用 JavaScript

    System.setProperty("webdriver.chrome.driver", "D:/selenium/Driven/chrom2.22/chromedriver_win32/chromedriver.exe");
        ChromeDriver chromeDriver = new ChromeDriver();
        chromeDriver.get("http://start.spring.io/");
        WebElement a = chromeDriver.findElement(By.linkText("Switch to the full version."));
        a.click();
        chromeDriver.executeScript("你的JS脚本");

3.1.19 截图

    chromeDriver.get("http://www.baidu.com");
        WebElement keyWord = chromeDriver.findElement(By.id("kw"));
        keyWord.sendKeys("王者荣耀");
        keyWord.sendKeys(Keys.ENTER);
        File file = chromeDriver.getScreenshotAs(OutputType.FILE);
        try {
            FileUtils.copyFile(file,new File("d:\\screenshot.png"));
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

3.1.20 关闭窗口

    quit/close
    quit仅仅可以退出单个页面
    close可以关闭多个打开的window

3.1.21验证码的处理

没有方法 - -。

4. WebDriver 原理

基于client-server模式
我们启动的chrome浏览器就是server端,而我们写的java代码,就是负责发送其你去的client
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值