Selenium原理

1、Selenium 1.0(Selenium RC):

早期的Selenium使用的是Javascript注入技术与浏览器打交道,需要Selenium RC启动一个Server,
 将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。
 因为Javascript可以获取并调用页面的任何元素,自如的进行操作,所以才实现了Selenium的目的:自动化Web操作

2、Selenium 2.x

当Selenium2.x 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原
生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器
本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大
提高,而且调用的稳定性交给了浏览器厂商本身,显然是更加科学。然而带来的一些副作用就是,不同的浏览器厂
商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提
供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包含了AndroidDriver和iOS WebDriver)

参考文章:

Selenium元素定位方法(八种)

1、通过Name定位元素

1.1、方法:By.name("name的值")
     介绍:通过元素的name属性来定位元素(但一般name属性并不是唯一的)
     示例: driver.findElement(By.name(""));    

1.2、方法:By.tagName("tagName的值");
     介绍:通过元素的标签名称来定位元素
     示例:driver.findElement(By.tagName(""));

1.3、方法:By.className("className的值");
     介绍:通过元素的class属性来进行定位(但一般name属性并不是唯一的)
     示例:driver.findElement(By.className(""))
     备注:该方法中的参数只有一个,所以若网页中class的属性有多个,只能选取其中一个来进行定位

2、通过ID定位元素

2.1、方法:By.id("id的值")
     介绍:通过元素的id来进行定位
     示例:driver.findElement(By.id("id的值"));
     备注:元素的id是唯一的,所以首选By.id方法来进行元素的定位;
          但有的元素没有id,就需要选择其他的方法来进行元素的定位

3、通过LinkText定位元素

3.1、方法:By.linkText("链接的全部内容")
     介绍:作用于a标签,匹配链接的全部文字内容
     示例:driver.findElement(By.linkText("车辆管理"));

3.2、方法:By.partiallinkText("链接的部分内容")
     介绍:作用于a标签,匹配链接的部分文字内容
     示例:driver.findElement(By.partiallinkText("车辆"));

4、通过css定位元素

4.1、方法:By.cssSelector("css表达式");选择某一个符合css表达式的元素
          By.cssSelectors("css表达式");选择全部符合css表达式的元素  
     介绍:通过css表达式这种组合的方式来进行定位,和xpth方式基本相同
     示例:driver.findElement(By.cssSelector(".bgcolor"));
     备注:
     1、cssSelector即css选择器,即 .bgcolor{  color : red }这个CSS表达式中 .bgcolor就是cssSelector
     2、该方法还可以使用id,tagname,class来定位元素
          (1)ID:  By.cssSelector("#ID值");  //需要在id值前面加上#
          (2)Tagname:By.cssSelector("tag值");
          (3) Class:By.cssSelector(".class值");  //需要在前面加上 .(加上点)

5、通过xpth定位元素

5.1、方法:By.xpth("元素路径");选择某一个符合css表达式的元素
     介绍:通过元素路径来进行定位          
     示例:driver.findElement(By.xpth("/html/body/div[1]/section/aside/div/"));
     备注:元素的路径可以使用一些浏览器组件来进行查找,例如xpthFind、xpthHelp等,可以快速定位元素的路径

5.2、xpth定位语法
   /    绝对定位,从根节点进行选取
   //   相对定位,从匹配选择的当前节点选择文档中的节点
   .    选取当前节点
   ..   选取当前节点的父节点
   @    选取属性,@class='XXX' @id='XXX' 属性放在[]中  【 //div[@name='phone']//input 】
   *    通配符,匹配所有 //*
   @*   通配符,匹配所有属性  //*[@*='hello'] 

5.3、xpth定位方式
     xpath定位分为绝对定位和相对定位
    (1)绝对定位 (/):严格按照路径、同级元素的位置来定位,缺点:页面一动,基本崩溃
         例如:/html/body/div[2]/div/form/div[1]/input  以/html开始
    (2)相对定位(//):有一个参照物   不考虑路径和位置       以//开头   //标签名[@属性名称=值]
         例如//input[@name='phone']  # 标签名为input并且name属性值为phone
5.4、其他语法
    (1)and  or
      示例: //input[@name='phone' and @datatype='m']
    (2)包含 
       //input[contains(@class,'username') ]   //标签名[contains(@属性值,被包含的值)]
    (3)文本内容定位
    示例://a[text()='数据分析']           //a[contains(text(),'数据分析')]