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]来表示,也是可以的。
posted @ 2013-06-10 16:43  Agoly  阅读(525)  评论(0编辑  收藏  举报