zoukankan      html  css  js  c++  java
  • Selenium入门

    Selenium超简单入门       

       
    一、它可以做什么
    小时候玩网游时,接触过一款名为“按键精灵”的软件,可以用它先录好一些点击事情,例如让游戏人物在原地转圈,发招打怪等,之后自己就可以不用重复点鼠标,按键精灵能帮我们反复执行动作。selenium的作用,与之类似,他是一款自动化工具,是网页自动化测试、网页数据爬虫的利器。
    二、一个最简单的例子
    1、获取依赖包
    获取selenium-server-standalone-2.25.0.jar并引入到项目中
     
    获取chrome浏览器内核driver程序chromedriver.exe,并放到D:/WebDriver/
     
    2、例子程序(配好依赖包,可直接用哦)
    1. import org.openqa.selenium.By; 
    2. import org.openqa.selenium.WebDriver; 
    3. import org.openqa.selenium.WebElement; 
    4. import org.openqa.selenium.chrome.ChromeDriver; 
    5.  
    6. /**
    7. * 这段程序演示了:借助 selenium,启动 chrome浏览器,并登录QQ邮箱的过程
    8. *
    9. * @author lizeyang
    10. *
    11. */ 
    12. publicclass SeleniumUtil 
    13.         // 浏览器程序的路径 
    14.         private String webBrowserPath = ""
    15.  
    16.         private WebDriver driver = null
    17.  
    18.         private String loginUrl = "https://mail.qq.com/cgi-bin/loginpage" ;// QQ邮箱的登录页 
    19.         private String username = "10000"; // QQ帐号 
    20.         private String password = "helloworld"; // QQ密码 
    21.  
    22.         // 初始化 selenium要调用的浏览器并启动 
    23.         publicvoid init() 
    24.        { 
    25.                webBrowserPath = "D:/WebDriver/chromedriver.exe"
    26.               System. setProperty( "webdriver.chrome.driver", webBrowserPath ); 
    27.                driver = new ChromeDriver(); 
    28.        } 
    29.  
    30.         // 关闭浏览器 
    31.         publicvoid quitDrvier() 
    32.        { 
    33.                if ( null != driver) 
    34.               { 
    35.                       driver .quit(); 
    36.               } 
    37.        } 
    38.  
    39.         publicvoid waitForSecond() 
    40.        { 
    41.                try 
    42.               { 
    43.                      Thread. sleep(1000); 
    44.               } 
    45.                catch (InterruptedException e) 
    46.               { 
    47.                      e.printStackTrace(); 
    48.               } 
    49.        } 
    50.  
    51.         // 模拟登录过程 
    52.         publicvoid login() 
    53.        { 
    54.                driver .get(loginUrl ); // 进入QQ登录页 
    55.               WebElement element = driver .findElement(By.id( "uin" ));// 找到id名为 uin的dom 元素 
    56.               element.sendKeys( username );// 当前element为 uin输入框,将用户名填到这个输入框 
    57.               waitForSecond(); // 让进程等待一会,避免偶尔出现的元素获取异常 
    58.               element = driver .findElement(By.id( "p" ));// 找到id名为p的 dom元素 
    59.               element.sendKeys( password );// 将密码填入 
    60.               waitForSecond(); 
    61.               element = driver .findElement(By.id( "btlogin" ));// 找到登录按钮 
    62.               waitForSecond(); 
    63.               element.click(); // 点击登录按钮 
    64.        } 
    65.  
    66.         publicvoid demo() 
    67.        { 
    68.               init(); 
    69.               login(); 
    70.                // quitDrvier(); 
    71.        } 
    72.  
    73.         publicstaticvoid main(String[] args) 
    74.        { 
    75.               SeleniumUtil util = new SeleniumUtil(); 
    76.               util.demo(); 
    77.        } 
    78.  
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.WebElement;
    import org.openqa.selenium.chrome.ChromeDriver;
    
    /**
     * 这段程序演示了:借助 selenium,启动 chrome浏览器,并登录QQ邮箱的过程
     *
     * @author lizeyang
     *
     */
    public class SeleniumUtil
    {
            // 浏览器程序的路径
            private String webBrowserPath = "";
    
            private WebDriver driver = null;
    
            private String loginUrl = "https://mail.qq.com/cgi-bin/loginpage" ;// QQ邮箱的登录页
            private String username = "10000"; // QQ帐号
            private String password = "helloworld"; // QQ密码
    
            // 初始化 selenium要调用的浏览器并启动
            public void init()
           {
                   webBrowserPath = "D:/WebDriver/chromedriver.exe" ;
                  System. setProperty( "webdriver.chrome.driver", webBrowserPath );
                   driver = new ChromeDriver();
           }
    
            // 关闭浏览器
            public void quitDrvier()
           {
                   if ( null != driver)
                  {
                          driver .quit();
                  }
           }
    
            public void waitForSecond()
           {
                   try
                  {
                         Thread. sleep(1000);
                  }
                   catch (InterruptedException e)
                  {
                         e.printStackTrace();
                  }
           }
    
            // 模拟登录过程
            public void login()
           {
                   driver .get(loginUrl ); // 进入QQ登录页
                  WebElement element = driver .findElement(By.id( "uin" ));// 找到id名为 uin的dom 元素
                  element.sendKeys( username );// 当前element为 uin输入框,将用户名填到这个输入框
                  waitForSecond(); // 让进程等待一会,避免偶尔出现的元素获取异常
                  element = driver .findElement(By.id( "p" ));// 找到id名为p的 dom元素
                  element.sendKeys( password );// 将密码填入
                  waitForSecond();
                  element = driver .findElement(By.id( "btlogin" ));// 找到登录按钮
                  waitForSecond();
                  element.click(); // 点击登录按钮
           }
    
            public void demo()
           {
                  init();
                  login();
                   // quitDrvier();
           }
    
            public static void main(String[] args)
           {
                  SeleniumUtil util = new SeleniumUtil();
                  util.demo();
           }
    
    }
    你可以直接将这段代码copy到你新建的工程中并运行,你看到的效果是:程序自动地启动了一个浏览器,来到QQ邮箱登录页,帐号密码被自动填充到相应输入框,登录到邮箱中
    三、页面元素的捕获
    使用selenium过程中,一个重要过程,就是对页面元素进行获取,之后才能对这个页面元素做相应操作。因此,这里对页面元素的捕获做一个补充说明。
    如例子程序中所示,获取页面元素的基本方法是driver .findElement().你可以给findElement()传入多个参数,表示不同的页面元素寻找方法.例如通过查找页面元素的id是通过By.id这个名字。
    更多的方法如下图所示:
     
    这里特别推荐xpath的方式,Xpath的能力非常强大,基本上所有的元素都能拿到。例如,就算页面元素既没有id号,又没有唯一的class名称,它的父节点是一个div,拥有class名为paginatorBatchSizes,而它自己本身是一个span元素,那么By.xpath("//div[@class='paginatorBatchSizes']/span")就能拿到这个元素。总而言之,Xpath的能力,还有更多的想象空间,但它具体还有哪些能力,这里就不展开了,可以到Xpath常见用法做进一步了解
     
     
    Xpath常见用法       
            http://blog.csdn.net/lizeyang/article/details/8884501
    《Selenium超简单入门》一文中,介绍了Selenium爬取网页数据、网页自动测试的基本方法。而在使用Selenium过程中,经常需要查找页面中的DOM元素,我们必须告诉Selenium如何找到页面中的指定元素,然后它才能再执行诸如点击、获取Text等事件。而Xpath这时候就能派上用场,它是一门在xml、html文档中查找信息的语言,它通过简单的表达,就能描述某个节点在xml文档中的位置,从而让selenium找到这个节点。
     
    下面结合笔者在使用selenium的经历,介绍Xpath最为常见的几个用法。
     
    例子文档如下
    1. <div> 
    2. <divclass='center'> 
    3.   <p> 
    4.     test1 
    5.   </p> 
    6.   <p> 
    7.    test2 
    8.   </p> 
    9. </div> 
    10. </div> 
    <div>
     <div class='center'>
      <p>
        test1
      </p>
      <p>
       test2
      </p>
     </div>
    </div>
     
    假设我们要查找的是字符串test1所在的那个节点,该如何表示呢?它是p节点的内容,而这个P节点,是class值为center的div的第一个p节点。因此,它的xpath可以这样描述://div[@class='center']/p[1]
     
    注意表达式中的'//','@'.‘[1]',它们的作用是什么呢?
    1.//
    表示在整个html文档中进行查找。以本文为例,//后面跟着div,就表示在html文档中查找所有的div元素,例子中有两个div元素,因此满足条件的,也有两个。如果将//改成/,则表示从根节点开始查找,因此/div就表示查找根节点下的div元素,因此,尽管例子文档中有两个div,但满足条件的,只有根节点下的div
    2.@
    例子文档中,有两个div,如何准确表达我们要的div呢?注意到那个div是带有class属性,值为center的。它的xpath表达就是div[@class='center']。其中的class也可以换成其他的属性值,比如这个div是有id的,值为test,那么相应的xpath就是div[@id='test']
    3.[1]
    在例子文档中,满足//div[@class='center']/p这一规则的,有两个P节点,如果我们想要第一个,则需要加上[1],想要第二个,则要加上[2],以此类推。
    4.*
    *通配符,和正则表达式一样,它表示任意的字符。例子文档中,只有一个节点是带class,那么,我们可以不用明确指定它是一个div,换成//*[@class='center']/p[1]来表示,也是可以的。
  • 相关阅读:
    新版淘淘商城_01_简介
    JavaMail之-通过邮件激活账号
    javaMail发送邮件
    JavaMail学习之一-邮件传输协议
    解决ios的safari不能自动播放audio问题(以及部分微信也不能自动播放)
    css3背景渐变色
    jq杂记
    各种“分享按钮“方法总结
    底部导航统一高度
    js 与或运算符 || && 妙用
  • 原文地址:https://www.cnblogs.com/qmfsun/p/3130879.html
Copyright © 2011-2022 走看看