selenium常用操作

来源:互联网 发布:西门子s7300编程软件 编辑:程序博客网 时间:2024/05/16 10:37

selenium文档

Selenium IDE界面说明:

1.文件:创建、打开和保存测试案例和测试案例集;编辑:复制、粘贴、删除、撤销和选择测试案例中的所有命令;Options: 用于设置seleniunm IDE

2. 用来填写被测网站的地址

3. 速度控制:控制案例的运行速度

4. 运行所有:运行一个测试案例集中的所有案例

5. 运行:运行当前选定的测试案例

6. 暂停/恢复:暂停和恢复测试案例执行

7. 单步:可以运行一个案例中的一行命令

8. 录制:点击之后,开始记录你对浏览器的操作

9. 案例集列表

10. 测试脚本;table标签:用表格形式展现命令及参数;source标签:用原始方式展现,默认是HTML语言格式,也可以用其他语言展示

11. 查看脚本运行通过/失败的个数

12. 当选中前命令对应参数

13. 日志:当你运行测试时,错误和信息将会自定显示;参考:当在表格中输入和编辑selenese命令时,面板中会显示对应的参考文档;UI元素:参考帮助菜单中的;Rollup:暂无

selenium中close和quit的区别

         close:表示关闭当前页面(窗口)

         quit:表示退出浏览器

元素定位方法:

定位方法

Java语言实现实例

id 定位

driver.findElement(By.id(“id的值”));

name 定位

diver.findElement(By.name(“name的值”));

链接的全部文字定位

driver.findElement(By.linkText(“链接的全部文字”));

链接的部分文字定位

driver.findElement(By.partialLinkText(“链接的部分文字”));

css 方式定位

driver.findElement(By.cssSelector(“css表达式”));

xpath 方式定位

driver.findElement(By.xpath(“xpath表达式”));

Class 名称定位

driver.findElement(By.className(“class属性”));

TagName 标签名称定位

driver.findElement(By.tagName(“标签名称”));

Jquery方式

Js.executeScript(“return jQuery.find(“jquery表达式”)”)

1.通过ID查找元素:By.id()

  以百度主页为例:搜索框的HTML示例代码如下,它的ID为kw

<input type="text"class="s_ipt" name="wd" id="kw"maxlength="100" autocomplete="off">

  “百度一下”搜索按钮元素的HTML示例代码如下,它的ID为su

<input type="submit"value="百度一下"id="su" class="btn self-btn bg s_btn">

 selenium/webdriver中通过ID查找元素的java实例代码:

 Webdriver driver = new FirefoxDriver();

 driver.get(“https://www.baidu.com/”);

 

 WebElement searchBox = driver.findElement(By.id(“kw”));

 searchBox.sendKeys(“小坦克 博客园”);

 WebElement searchButton = driver.findElement(By.id(“su”));

  searchButton.submit();

 

 driver.close();

2. 通过Name查找元素:By.name()

以豆瓣网的主页搜索框为例, 其搜索框的HTML代码如下,  它name是: q

<input type="text" maxlength="60"size="12" placeholder="书籍、电影、音乐、小组、小站、成员" name="q" autocomplete="off">

  WebDriver中通过name查找豆瓣主页上的搜索框的Java代码如下:

WebDriver driver  = newFirefoxDriver();

 driver.get("https://www.douban.com/");

 

 WebElement searchBox = driver.findElement(By.name("q"));

 searchBox.sendKeys("小坦克");

 searchBox.submit();

3. 通过TagName查找元素: By.tagName()

通过tagName来搜索元素的时候,会返回多个元素. 因此需要使用findElements()

   WebDriver driver  = newFirefoxDriver();

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

 

   List<WebElement> buttons =driver.findElements(By.tagName("div"));

   System.out.println("Button:" + buttons.size());

注意:  如果使用tagName,  要注意很多HTML元素的tagName是相同的,

 

比如单选框,复选框, 文本框,密码框.这些元素标签都是input.  此时单靠tagName无法精确获取我们想要的元素, 还需要结合type属性,才能过滤出我们要的元素

   WebDriver driver  = newFirefoxDriver();

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

        

   List<WebElement> buttons = driver.findElements(By.tagName("input"));

   for (WebElement webElement : buttons) {

        if (webElement.getAttribute("type").equals("text")){

            System.out.println("input text is :" + webElement.getText());

        }

    }

3. 通过ClassName 查找元素 By.className

   以淘宝网的主页搜索为例, 其搜索框的HTML代码如下:   class="search-combobox-inpu

t"

<input autocomplete="off" autofocus="true"accesskey="s" aria-label="请输入搜索文字" name="q" id="q"class="search-combobox-input" aria-haspopup="true"aria-combobox="list"

role="combobox" x-webkit-grammar="builtin:translate"tabindex="0">

 

   WebDriver driver  = new FirefoxDriver();

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

   Thread.sleep(15000);

   WebElement searchBox =driver.findElement(By.className("search-combobox-input"));

 

  searchBox.sendKeys("羽绒服");

   searchBox.submit();

注意:使用className 来进行元素定位时,有时会碰到一个

4. 通过LinkText查找元素 By.linkText();

  直接通过超链接上的文字信息来定位元素:例如

<ahref="https://passport.baidu.com/v2/?login&amp;tpl=mn&amp;u=http%3A%2F%2Fw

ww.baidu.com%2F" name="tj_login" class="lb"onclick="return false;">登录</a>

  实例代码:

  WebDriverdriver  = new FirefoxDriver();

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

 WebElement loginLink = driver.findElement(By.linkText("登录"));

 loginLink.click();

5. 通过PartialLinkText查找元素 By.partialLinkText()

  此方法是上一个方法的加强版,单你只想用一些关键字匹配的时候,可以使用这个方法,通过部分超链接文字来定位元素

HTML 代码如下

  WebDriverdriver = new FirefoxDriver();

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

 WebElement loginLink = driver.findElement(By.partialLinkText("登"));

 loginLink.click();

  注:用这种方法定位时,可能会引起的问题是,当你的页面中不知一个超链接包含“等”时, findElement方法只会返回第一个查找到的元素,而不会返回所有符合条件的元素;如果你想要获得所有符合条件的元素,还是只能用findElements方法

6. xpath定位

{ xpath 这种定位方式,webdriver会将整个页面的所有元素进行扫描以定位我们所需要的元素,这是个非常费时的操作,如果脚本中大量使用xpath做元素定位的话, 脚本的执行速度可能会稍慢 }

绝对路径和相对路径的区别----绝对路径  以"/"  开头, 让xpath 从文档的根节点开始解析

                        -----相对路径  以"//"开头, 让xpath 从文档的任何元素节点开始解析

7. XPATH元素定位(升级版)

1)通过绝对路径定位

  By.xpath(“html/body/div/form/input”);

2)通过相对路径定位

 By.xpath(“//input//div”);

3)通过元素索引定位

 By.xpath(“//input[4]”);

4)使用xpath+节点属性定位(结合第2、第3中方法可以使用)

 By.xpath(“//input[@id=’kw1’]”);

 By.xpath(“//input[@type=’name’ and @name=’kw1’]”);

5)使用部分属性值匹配

 By.xpath(“//input[start-with(@id, ’nice’)]”);

 By.xpath(“//input[ends-with(@id, ‘很漂亮’)]”);

 By.xpath(“//input[contains(@id, ‘那么美’)]”);

6)使用前集中方法的组合

 By.xpath(“//input[@id=’kw1’]//input[start-with(@id, ‘nice’)]/div[1]/form[3]”);

常见web UI 元素操作 及API使用

{ http://www.cnblogs.com/TankXiao/p/5252754.html}

1.链接(link)

<div>

       <p>链接 link</p>

       <a href="www.cnblogs.com/tankxiao">小坦克</a>

   </div>

  链接操作:

  //找到链接

 WebElement link1 = driver.findElement(By.linkText(“小坦克”));

 WebElement link1 = driver.findElement(By.partialLinkText(“坦克”));

  //点击链接

 link1.click();

2.输入框textbox

<div>

       <p>输入框 testbox</p>

       <input type="text" id="usernameid"value="username" />

   </div>

  输入框操作:

  //找到元素

 WebElement element = driver.findElement(By.id(“usernameid”));

  //在输入框中输入内容

  element.sendKeys(“test111111”);

  //清空输入框

 element.clear();

  //获取输入框的内容

 element.getAttribute(“value”);

3.按钮(Button)

 <div>

    <p>按钮</p>

    <input type="button" value=”添加” id=”proAddItem_0” />

 </div>

  //找到元素

 String xpath = “//path[@value=’添加’]”;

 WebElement addButton = driver.findElement(By.xpath(xpath));

//点击按钮

addButton.click();

  //判断是否enable

 addButton.isEnabled();

4.下拉选择框(Select)

 <div>

   <p>下拉选择 Select</p>

   <select id=”proAddItem_kind” name=”kind”>

     <option value="1">电脑硬件</option>

     <option value="2">房产</option>

     <option value="18">种类AA</option>

     <option value="19">种类BB</option>

     < option value="20">种类BB</ option >

     < option value="21">种类CC</ option >

    </select>

 </div>

  下拉选择框的操作:

  //找到元素

 Select select = new Select(driver.findElement(By.id(“proAddItem_kind”)));

  //选择对应的选项,index 从0开始的

 select.selectByIndex(2);

 select.selectByValue(“18”);

 select.selectByVisibleText(“种类AA”);

  //获取所有的选项

 List<WebElement> options = select.getOption();

 for(WebElement webElement : option){

   System.out.println(webElement.getText());

  }

5.单选按钮(RadioButton)

  <div>

    <p>单选项Radio Button</p>

    <inputtype="radio" value="Apple" name="fruit>"/>Apple

    <inputtype="radio" value="Pear" name="fruit>" /> Pear

    <inputtype="radio" value="Banana" name="fruit>"/> Banana

    <inputtype="radio" value="Orange" name="fruit>"/> Orange

  </div>

  单选项元素的操作

  //找到元素

 String xpath = “//input[@type=’radio’][@value=’Apple’]”;

 WebElement apple = driver.findElement(By.xpaty(xpath));

  //选择某个元素

 applie.click();

  //判断某个单选框是否已经被选择

  BooleanisAppleSelect = apple.isSelected();

  //获取元素属性

 apple.getAttribute(“value”);

6.多选框

 <div>

    <p>多选项Radio Button</p>

    <inputtype="radio" value="Apple" name="fruit>"/>Apple

    <inputtype="radio" value="Pear" name="fruit>" /> Pear

    <inputtype="radio" value="Banana" name="fruit>"/> Banana

    <inputtype="radio" value="Orange" name="fruit>"/> Orange

 </div>

  多选框的操作和单选框一模一样的

操作浏览器

1.浏览器最大化、前进、多退、刷新

public static void testBrowser(WebDriverdriver) throws Excepotion{

 driver.get(“http://www.cnblogs.com/tankxiao”);

 Thread.sleep(5000);

  //浏览器最大化

 driver.manage().window().maximize();

 driver.navigate().to(“http://www.baidu.com”);

  //刷新浏览器

 driver.naviget.refresh();

  //浏览器后退

  driver.navigate.back();

  //浏览器前进

 driver.navigate.forward();

  //浏览器退出

 driver.quit();

}

2.截图操作

public static void testScreenShot(WedDriverdriver) throws Exception{

 driver.get(“http://www.baidu.com”);

 File srcFile = ((TakesScreenshot)driver).getSreenshotAs(OutputType.FILE);

  /**

* 利用FileUtils工具类的copyFile()方法保存getScreenshotAs()返回的文件对象

         *new File()第一个参数表示截图储存路径;如果该文件在本工程目录下,只需要填写文件夹名字即可;如果该文件夹没有在该工程目录下,则需要填写完成的路径

         *new File()第二个参数表示截图保存的文件名

*/

  FileUtils.copyFile(srcFile,new File("snapshot", System.currentTimeMillis()  + ".png"));

}

3.模拟鼠标操作

public static voidrightClickMouse(WebDriver driver){

 driver.get(“http://www.baidu.com”);

 Action action = new Action(driver);

 action.contextClick(driver.findElement(By.id(“kw”))).perform();

}

4.杀掉Windows浏览器进程

public static void killProcess(){

  //killfirefox

 WindowsUtils.tryToKillByName(“firefox.exe”);

 //kill IE

 WindowsUtils.tryToKillByName(“iexplore.exe”);

 //kill chrome

 WindowsUtils.tryToKillByName(“chrome.exe”);

}

操作弹出对话框

1.对话框类型

  1)警告框:用于提示用户相关信息的验证结果, 错误或警告等


  2)提示框:用于提示用户在当前对话框中输入数据,一般需要用户单击取消或者确认按钮


  3)确认框:用于提示用户确认或者取消某个操作,一般需要用户单击取消或者确认按钮


  操作对话框代码:

public static void testAlert(WebDriverdriver)

    {

       String url="http://sislands.com/coin70/week1/dialogbox.htm";

       driver.get(url);

       

       WebElement alertButton =driver.findElement(By.xpath("//input[@value='alert']"));

       alertButton.click();

       

       Alert javascriptAlert = driver.switchTo().alert();

       System.out.println(javascriptAlert.getText());

       javascriptAlert.accept();

    }

   

   public static void testPrompt(WebDriver driver) throws Exception

    {

       String url="http://sislands.com/coin70/week1/dialogbox.htm";

       driver.get(url);

       

       WebElement promptButton =driver.findElement(By.xpath("//input[@value='prompt']

"));

       promptButton.click();

       Thread.sleep(2000);

       Alert javascriptPrompt = driver.switchTo().alert();

       javascriptPrompt.sendKeys("This is learning Selenium");

       javascriptPrompt.accept();   

       

       System.out.println(javascriptPrompt.getText());

       

       javascriptPrompt=driver.switchTo().alert();

       javascriptPrompt.accept();

       

       Thread.sleep(2000);

       promptButton.click();

       javascriptPrompt=driver.switchTo().alert();

       javascriptPrompt.dismiss();

       Thread.sleep(2000);

        javascriptPrompt=driver.switchTo().alert();

       javascriptPrompt.accept();

    }

   

   public static void testConfirm(WebDriver driver) throws Exception

    {

       String url="http://sislands.com/coin70/week1/dialogbox.htm";

       driver.get(url);

       

       WebElement confirmButton =driver.findElement(By.xpath("//input[@value='confirm']

"));

       confirmButton.click();

       Thread.sleep(2000);

       Alert javascriptConfirm = driver.switchTo().alert();

       javascriptConfirm.accept();

       Thread.sleep(2000);

       javascriptConfirm = driver.switchTo().alert();

       javascriptConfirm.accept();

    }

2.原理

在代码里,通过Set<String>allWindowsId = driver.getWindowHandles();来获取到所有弹出浏览器的句柄,然后遍历,使用swithcto.window(newwindow_handle)方法。就可以定位到新的窗口

3.测试页面的HTML

<html> 

   <head> 

<title>Alert</title> 

   </head> 

   <body> 

   <input id = "alert" value = "alert" type ="button" onclick = "alert('欢迎!请按确认继续!');"/> 

   <input id = "confirm" value = "confirm" type ="button" onclick = "confirm('确定吗?');"/> 

   <input id = "prompt" value = "prompt" type ="button" onclick = "var name = prompt('请输入你的名字:','请输入  你的名字'); document.write(name) "/>

   </body>

</html>

4.Java代码

public static voidtestMultipleWindowsTiltle(Webdriever driver) throws Exception{

 String url = “E:\\StarthFolder\\huoli_28@hotmail.com\\Stash\\Tank-MonkeyProject\\Selenium

WebDriver\\AllUIElement.html”;

  driver.get(url);

  //获取当前窗口的句柄

  String parenWindowId =driver.getWindowHandle();

  System.out.println(“driver.getTitle():”+ driver.getTitle());

 

  WebElement button =driver.findElement(By.xpath(“//input[@value=’打开窗口’]”));

  button.click();

 

  Set<String>allWindowId = driver.getWindowHandles();

  //获取所有打开的窗口的句柄

  for(String windowId :allWindowsId){

   if(driver.switchTo().window(windowId).getTitle().contains(“博客园”)){

 driver.switchTo().window(windowId);

  break;

}

}

System.out.println(“driver.getTitle():” + driver.getTitle());

//再次切换回原来的父窗口

driver.switchTo().window(parentWindowId);

System.out.println(“parentWindowId:” + driver.getTitel());

}

driver.switchTo().alert() 这句可以得到alert\confirm\prompt对话框的对象

. getText() 得到它的文本值
. accept()
相当于点击它的"确认"
. dismiss()
相当于点击"取消"或者叉掉对话框
. sendKeys()
输入值

智能等待页面加载完成

实例:set_timeout.html 下面的html 代码,  点击click 按钮5秒后,页面上会出现一个红色的div快,我们需要写一段自动化脚本智能的去判断这个div是否存在,然后把这个div 然后高亮

<html>

   <head>

       <title>Set Timeout</title>

       <style>

           .red_box {background-color:red; width = 20%; height: 100px; border: none;}

       </style>

       <script>

           function show_div(){

               setTimeout("create_div()", 5000);

           }

 

           function create_div(){

               d =document.createElement('div');

                d.className ="red_box";

                document.body.appendChild(d);

           }

       </script>

   </head>

   <body>

       <button id = "b" onclick ="show_div()">click</button>

   </body>

</html>

1.隐式等待

 WebDriver driver = new FireFfoxDriver();

 driver.get(“file:///C:/Users/Tank/Desktop/set_timeout.html”);

 

 driver.manage().timeouts().implicitlyWait(20, TimeUnitl.SENCONDS);

  //等待10s,如果10s元素还不存在,就会抛出异常

 WebElement element = driver.findElement(By.cssSelector(“.red_box”));

 ((JavascriptExecutor)driver).executeScript(“argument[0].style.border= \"5pxsolid yellow\"”, element);

2.显示等待

等待的条件

WebDriver方法

页面元素是否在页面上可用和可被单击

elementToBeClickable(By locator)

页面元素处于被选中状态

elementToBeSelected(WebElement element)

页面元素在页面中存在

presenceOfElementLocated(By locator)

在页面元素中是否包含特定的文本

textToBePresentInElement(By locator)

页面元素值

textToBePresentInElementValue(By locator, java.lang.String text)

标题 (title)

titleContains(java.lang.String title)

  只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑;如果超过设定的最大显式等待时间阈值,这测试程序会抛出异常。

 public static void testWait2(WebDriver driver){

     driver.get(“E:\\StashFolder\\huoli_28@hotmail.com\\Stash\\Tank-MoneyProject\\浦东软件园培训中心\\我的教材\\SeleniumWebdriver\\set_timeout.html”);

 

  WebDriver wait = newWebDriverWait(driver ,30);

 wait.until(ExpectedConditons.presenceOfElementLocated(By.cssSelector(“.red_box”)));

  WebDriver element =driver.findElement(By.cssSelector(“.red_box”));

 ((JavascriptExcutor)driver).excuteScript(“argument[0].style.border = \"5pxsolid yellow\"", element);

}

 

鼠标操作

点击鼠标左键:

 Actions action = new Actions(driver);

 action.click();  //在当前位置点击左键

 action.click(driver.findElement(By.id(“”)));  //在指定位置单机左键

点击鼠标右键:

 Actions action = new Actions(driver);

 action. contextClick ();  //在当前位置点击右键

 action. contextClick (driver.findElement(By.id(“”)));  //在指定位置点击右键

双击鼠标:

Actions action = new Actions(driver);

 action. doubleClick();  //在当前位置点击左键

 action. doubleClick (driver.findElement(By.id(“”)));  //再指定位置双击

拖拽动作

Actions action = new Actions(driver);

 action. dragAndDrop (source,target);  //将source元素拖放到target元素的位置

 action. doubleClick (source, xOffset, yOffset);  //将source元素拖放到(xOffset, yOffset)位置,其中xOffset为横坐标,yOffset为纵坐标

鼠标悬停:

Actions action = new Actions(driver);

action.clickAndHold();  //在当前位置悬停

action.clickAndHold(onElement); //鼠标悬停在 onElement 元素的位置

鼠标移动:

Actions action = new Actions(driver);

 action.moveToElement(toElement);  //将鼠标移到 toElement

  action.moveToElement(toElement,xOffset,yOffset)  //将鼠标移到元素 toElement 的 (xOffset,yOffset) 位置

action.moveByOffset(xOffset,yOffset);  //以鼠标当前位置或者 (0,0) 为中心开始移动到(xOffset, yOffset) 坐标轴

模拟键盘操作

对于键盘的模拟操作,Actions 类中有提供keyUp(theKey)、keyDown(theKey)、sendKeys(keysToSend) 等方法来实现

 

Actions action = new Actions(driver);

 action.sendKes(Keys.TAB);  //模拟按下并释放TAB键

 action.sendKeys(Keys. CONTROL); //模拟按下并释放CONTROL键

使用Robot类来操作Keys

使用Robot需要导入两个java包:java.awt.AWTException、java.awt.Robot

以下代码未使用实例代码


一下示例代码是模拟键盘实现复制、粘贴功能


模拟键盘操作的另一种方式:通过sendKeys(Keys.CONTROL,“a”)方式模拟复制粘贴


selenium处理页面滚动

利用webdriver执行脚本直接滚动到指定坐标位置


滚动到指定元素位置

移动element“顶端”与当前窗口的“顶部”对齐:

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(true);", element);


移动element“底端”与当前窗口的“底部”对齐:

((JavascriptExecutor)driver).executeScript("arguments[0].scrollIntoView(false);", element);


滚动到目标元素的纵坐标位置

滚动到页面底部、顶部


获取页面body的高、宽度

selenium处理嵌入页面(frame技术)

         实例网站:http://data.pharmacodia.com/web/homePage/index?ns=1&ts=1&str=YWSJ


         在报错信息里面看到没有找到该元素时,首先检查是否元素定位错误,再次就是网页使用了frame嵌入技术。识别是否使用了frame技术,可以使用Firefox浏览器的firepath插件(先要安装firebug插件)查看,选中该元素右键选择firepathà如果左上角显示iframe标签则表示使用了frame技术,如果显示的时To Window则没有使用frame技术

selenium对窗口window的处理

窗口切换

selenium中提供了一个switchTo().window(handle)的方法来处理窗口的切换。

思路:①获取当前窗口的句柄(currenthandle)和当前所有窗口的句柄(allhandle)②把allhandle存入set集合中 ③用for循环去判断当前窗口是否是目标窗口,是则切换。

示例代码:(为了使用方便,先封装切换窗口的方法,使用过程调用即可[提供两种封装方法])



         完整的示例:


selenium中window.open()和click()点击链接的区别:

         使用window.open()点击当前页面链接,浏览器会new一个tab,即打开一个新的窗口

         使用click()点击当前页面链接,浏览器会在当前窗口跳转到新的页面,而不会new一个tab,即不会打开新的窗口


         当然,点击链接后会不会new一个tab,也是有网页本身决定,如果有target属性,则会new一个tab


下拉处理页面加载


可以通过sendKeys(Keys.DOWN)方法下拉(模拟键盘操作)加载页面


原创粉丝点击