zoukankan      html  css  js  c++  java
  • Selenium WebDriver高级用法

     

    Selenium GitHub地址 

    选择合适的WebDrvier

    WebDriver是一个接口,它有几种实现,分别是HtmlUnitDrvierFirefoxDriverInternetExplorerDriverChromeDriverOperaDriver,除了 InternetExplorerDriver只能在Windows平台运行,其他WebDriver均能跨平台。

    如果追求运行速度,HtmlUnitDriver是首选,但是它没有运行界面,不能实时看到运行效果。如果想看到运行效果,可以使用FirefoxDrvier,它会真正打开浏览器,在屏幕上运行,因此我们可以监测页面元素的位置、CSS的值等,但是代价就是速度慢。

    这里为了简单,使用 HtmlUnitDriver.

    WebDriver driver = new HtmlUnitDriver();

    导航

    有了WebDriver实例,第一件事情就是打开页面。一般的做法是调用get方法:

    driver.get("http://www.yeetrack.com");

    WebDriver会一直等待,直到页面加载完毕(也就是”onload”方法释放)。

    和页面进行交互

    仅仅打开页面还不够,我们需要的是在页面上进行操作,进一步讲就是要操作页面中的html元素,如:

    <input type="text" name="passwd" id="passwd-id" />

    要操作页面元素,首先要定位元素,可以通过多种方法定位,如下:

    WebElement element;
    element = driver.findElement(By.id("passwd-id"));
    element = driver.findElement(By.name("passwd"));
    element = driver.findElement(By.xpath("//input[@id='passwd-id']"));

    定位元素时,有两点要注意。通过text的值来定位一个Link时,text必须精确匹配;通过xpath来定位元素时,如果匹配到多条,只会返回第一条结果,如果没有匹配到,会抛NoSuchElementException异常。

    WebDriver拥有”Object-baseed” API,我们可以使用WebElement来表示所有的页面元素。WebElement类有很多操作元素的方法,但是有些方法可能对当前元素无效,不用担 心,WebDriver会尽力帮我们处理。如,对一个”meta”标签元素,我们调用了WebElement的”SetSelected()”方 法,WebDriver会抛出异常。

    我们定位到一个Element,接下来,我们可能要进行一些操作,如想键入一些字符:

    element.sendKeys("sone text");

    当然,我们也可以通过”Keys”这个类,来模拟键盘输入:

    element.sendKeys(" and some", Keys.ARROW_DOWN);

    记住,我们向这些元素输入的字符串,它们不会自动清空,也就是说调用”sendKeys()”方法,就是向元素中追加字符串。如果要清空一个input标签或者textarea:

    element.clear();

    填写表单

    已经知道了如何键入字符串,那么其他元素呢?如checkboxes,如何选中;”OPTION”标签,如何设置”setSelected()”。下面是处理Select标签的例子:

    WebElement select = driver.findElement(By.xpath("//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();
    }

    上面的代码,首先定位一个Select元素,然后获取它下面的所有option,并且打印出来,执行一个click操作。明显,如果想选中某个选 中,这种方法不是最佳选择。其实WebDrvier定义了Select类,它提供一些更快捷的方式, 如”selectByIndex()”、”selectByValue()”。

    表单填写完毕,然后就是提交,我们可以通过点击提交按钮,进行提交。

    driver.findElement(By.id("submit")).click();

    或者,WebElement提供”submit()”这个方法,如果当前元素处在form表单中,调用该元素的submit方法,WebDriver就会自动提交这个表单;如果不处于form表单中,会抛出”NoSuchElementException”异常。

    element.submit();

    拖放

    WebDriver允许我们拖放元素,如将某个元素拖到其他地方、或者将某个元素拖到其他元素上。

    WebElement element = driver.findElement(By.name("source"));
    WebElement element = driver.findElement(By.name("target"));
    (new Actions(driver)).dragAndDrop(element, target).perform();

    切换window或者Frame

    对于现在的web应用程序来说,很少有单个window的情况,都是嵌入了其他的frame。WebDrvier支持使用”switchTO”方法切换到其他window。

    driver.switchTo().window.("windowName");

    上面的代码执行后,driver就会切换到windowName这个window。但是如何获取windowName呢?来一个例子:

    <a href="http://www.yeetrack.com" target="windowName">点击打开新窗口</a>

    还有,我们可以通过”window handle”来切换,并且还可以遍历当前所有的window

    for(String handle : driver.getWindowHandles())
    {
        driver.switchTo().window(handle);
    }

    切换frame(或者iframe)

    driver.switchTo().frame("frameName");

    switchTo()可以链式调用,或者通过index来切换

    drvier.switchTo().frame("frameName")
          .switchTo().frame(0)
          .switchTo().frame("child");

    上面的语句执行后,driver会进入”frameName”这个frame,然后进入到第一个子frame,然后再进入到这个子frame的名称是”child”的frame中。如果要回到顶级的frame,执行下面的代码:

    driver.switchTo().defaultContent();

    导航:History和Location

    早先,我们使用WebDriver的get方法,打开了”http://www.yeetrack.com”。WebDriver提供一些接口,其中一个如下:

    driver.navigate().to("http://www.yeetrack.com");

    “navigate().to()”和”get()”方法,实现的功能完全一样,只不过”get()”拼写起来更简单。

    “navigete”接口,还可以控制浏览器的前进和后退:

    driver.navigate().forward();
    driver.navigate().back();

    请注意,这个功能完全依赖于底层的浏览器。如果两种浏览器的行为不一致,那么代码执行的效果也会不一致。

    Cookies

    浏览器的安全测试,cookie是不能跨域的,所以你想操作A域名的cookie,首先你要让切换到A域名上。

    //打开域名
    driver.get("http://www.yeetrack.com");
    
    //添加Cookie
    Cookie cookie = new Cookie("uuid", "abcdedfjeiajfei");
    driver.manage().addCookie(cookie);
    
    //遍历当前域名的cookie
    Set(Cookie) allCookies = driver.manage().getCookies();
    for(Cookie loadedCookie : allCookies)
    {
        System.out.println(String.format("%s ---> %s", loadedCookie.getName(), loadedCookie.getValue()));
    }

    转自: Selenium WebDriver高级用法

  • 相关阅读:
    SPOJ_DSUBSEQ Distinct Subsequences
    ZOJ 3791 An easy game DP+组合数
    UVALive 4287 SCC-Tarjan 加边变成强连通分量
    ZOJ 3795 Grouping 强连通分量-tarjan
    HDU 4915 多校5 Parenthese sequence
    ZOJ 3790 Consecutive Blocks
    HDU 4866 多校1 主席树+扫描线
    求最大值及其下标
    查找整数
    抓老鼠
  • 原文地址:https://www.cnblogs.com/thinkCoding/p/6531611.html
Copyright © 2011-2022 走看看