Selenium3 浅尝

来源:互联网 发布:舒柏奇犬 知乎 编辑:程序博客网 时间:2024/06/05 00:43

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")//下面的是刷新页面,类似于F5driver.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
0 0
原创粉丝点击