selenium webdriver

ie11之F12 开发者调试工具

https://www.cnblogs.com/Ribbon/p/4549767.html

自动化webdriver测试工具入门简介

http://www.51testing.com/zhuanti/webdriver.htm

http://www.51testing.com/zhuanti/selenium.html

Selenium WebDriver高级用法

掌握selenium初级用法后,来继续深入学习

  选择合适的WebDrvier
  WebDriver是一个接口,它有几种实现,分别是HtmlUnitDrvier、FirefoxDriver、InternetExplorerDriver、ChromeDriver、OperaDriver,除了 InternetExplorerDriver只能在Windows平台运行,其他WebDriver均能跨平台。
  如果追求运行速度,HtmlUnitDriver是首选,但是它没有运行界面,不能实时看到运行效果。如果想看到运行效果,可以使用FirefoxDrvier,它会真正打开浏览器,在屏幕上运行,因此我们可以监测页面元素的位置、CSS的值等,但是代价就是速度慢。
  这里为了简单,使用 HtmlUnitDriver.
  <code>WebDriver  driver = new HtmlUnitDriver();</code>
  导航
  有了WebDriver实例,第一件事情就是打开页面。一般的做法是调用get方法:
  <code>driver.get("http://www.yeetrack.com");</code>
  WebDriver会一直等待,直到页面加载完毕(也就是”onload”方法释放)。
  和页面进行交互
  仅仅打开页面还不够,我们需要的是在页面上进行操作,进一步讲就是要操作页面中的html元素,如:
  <code><input type="text" name="passwd" id="passwd-id" /></code>
  要操作页面元素,首先要定位元素,可以通过多种方法定位,如下:
  <code>WebElement element;
  element = driver.findElement(By.id("passwd-id"));
  element = driver.findElement(By.name("passwd"));
  element = driver.findElement(By.xpath("//input[@id='passwd-id']"));</code>
  定位元素时,有两点要注意。通过text的值来定位一个Link时,text必须精确匹配;通过xpath来定位元素时,如果匹配到多条,只会返回第一条结果,如果没有匹配到,会抛NoSuchElementException异常。
  WebDriver拥有”Object-baseed” API,我们可以使用WebElement来表示所有的页面元素。WebElement类有很多操作元素的方法,但是有些方法可能对当前元素无效,不用担 心,WebDriver会尽力帮我们处理。如,对一个”meta”标签元素,我们调用了WebElement的”SetSelected()”方 法,WebDriver会抛出异常。
  我们定位到一个Element,接下来,我们可能要进行一些操作,如想键入一些字符:
  <code>element.sendKeys("sone text");</code>
  当然,我们也可以通过”Keys”这个类,来模拟键盘输入:
  <code>element.sendKeys(" and some", Keys.ARROW_DOWN);</code>
  记住,我们向这些元素输入的字符串,它们不会自动清空,也就是说调用”sendKeys()”方法,就是向元素中追加字符串。如果要清空一个input标签或者textarea:
  <code>element.clear();</code>
  填写表单
  已经知道了如何键入字符串,那么其他元素呢?如checkboxes,如何选中;”OPTION”标签,如何设置”setSelected()”。下面是处理Select标签的例子:
<code>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();
}</code>
  上面的代码,首先定位一个Select元素,然后获取它下面的所有option,并且打印出来,执行一个click操作。明显,如果想选中某个选 中,这种方法不是最佳选择。其实WebDrvier定义了Select类,它提供一些更快捷的方式, 如”selectByIndex()”、”selectByValue()”。
  表单填写完毕,然后就是提交,我们可以通过点击提交按钮,进行提交。
  <code>driver.findElement(By.id("submit")).click();</code>
  或者,WebElement提供”submit()”这个方法,如果当前元素处在form表单中,调用该元素的submit方法,WebDriver就会自动提交这个表单;如果不处于form表单中,会抛出”NoSuchElementException”异常。
  <code>element.submit();</code>
        拖放
  WebDriver允许我们拖放元素,如将某个元素拖到其他地方、或者将某个元素拖到其他元素上。
  <code>WebElement element = driver.findElement(By.name("source"));
  WebElement element = driver.findElement(By.name("target"));
  (new Actions(driver)).dragAndDrop(element, target).perform();</code>
  切换window或者Frame
  对于现在的web应用程序来说,很少有单个window的情况,都是嵌入了其他的frame。WebDrvier支持使用”switchTO”方法切换到其他window。
  <code>driver.switchTo().window.("windowName");</code>
  上面的代码执行后,driver就会切换到windowName这个window。但是如何获取windowName呢?来一个例子:
  <code><a href="http://www.yeetrack.com" target="windowName">点击打开新窗口</a></code>
  还有,我们可以通过”window handle”来切换,并且还可以遍历当前所有的window
  <code>for(String handle : driver.getWindowHandles())
  {
  driver.switchTo().window(handle);
  }</code>
  切换frame(或者iframe)
  <code>driver.switchTo().frame("frameName");</code>
  switchTo()可以链式调用,或者通过index来切换
  <code>drvier.switchTo().frame("frameName")
  .switchTo().frame(0)
  .switchTo().frame("child");</code>
  上面的语句执行后,driver会进入”frameName”这个frame,然后进入到第一个子frame,然后再进入到这个子frame的名称是”child”的frame中。如果要回到顶级的frame,执行下面的代码:
  <code>driver.switchTo().defaultContent();</code>
  导航:History和Location
  早先,我们使用WebDriver的get方法,打开了”http://www.yeetrack.com”。WebDriver提供一些接口,其中一个如下:
  <code>driver.navigate().to("http://www.yeetrack.com");</code>
  “navigate().to()”和”get()”方法,实现的功能完全一样,只不过”get()”拼写起来更简单。
  “navigete”接口,还可以控制浏览器的前进和后退:
  <code>driver.navigate().forward();
  driver.navigate().back();</code>
  请注意,这个功能完全依赖于底层的浏览器。如果两种浏览器的行为不一致,那么代码执行的效果也会不一致。
  Cookies
  浏览器的安全测试,cookie是不能跨域的,所以你想操作A域名的cookie,首先你要让切换到A域名上。
      
<code>//打开域名
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()));
}</code>

IDEA+Java:Selenium+Maven+TestNG基本WebUI自动化测试环境搭建

http://www.cnblogs.com/iceb/p/7111878.html

IntelliJ IDEA 15 创建maven项目

https://www.cnblogs.com/wql025/p/5215570.html

 

webdriver常用断言

webdriver的断言使用

操作(action)、辅助(accessors)和断言(assertion):

操作action:

如点击链接,选择选项的方式进行工作。如果一个动作执行失败,或是有错误,当前的测试将会停止执行。

操作中常见命令有:open(打开页面)

clickAndWait(点击并等待)

select(选择下拉菜单)

pause(等待指定时间,以毫秒为单位,即要睡眠的时间)

setTimeout(指定等待动作完成的等待时间。默认为30秒。

goBack(模拟用户点击其浏览器上的“back”按钮)

click与clickAndWait的区别:

Comand       Target

clickAndWait   css=input[type=submiit]           //句二

$this->click(“css=input[type=submit]“);         //此句对应上面的 句一

$this->waitForPageToLoad(“30000″);

Andwait这个后缀,告诉我们,该命令将使浏览器向服务器产生一个请求,使Selenium等待加载一个新的页面。

辅助accessors:

如:storeElementPresent(locator,variableName)

即将locator定位到的状态存储到variableName变量中。

可同断言一同使用。

断言assertion:

常见的断言包括:验证页面内容,如标题是否为X或当前位置是否正确,或是验证该复选框是否被勾选。

断言被用于三种模式: assert 、verify、waitfor

Verify 失败时,该测试将继续执行,并将错误记入日显示屏 。也就是说允许此单个 验证通过。确保应用程序在正确的页面上。

如果该条件为真,他们将立即成功执行。如果该条件不为真,则将失败并暂停测试。直到超过当前所设定的超时时间。 一般跟setTimeout时间一起用

断言常用的有

assertTitle(检查当前页面的title是否正确)、

assertSelected(检查select的下拉菜单中选中是否正确)、

assertText(检查指定元素的文本)、

assertTextNotPresent(检查在当前给用户显示的页面上是否没有出现指定的文本)、

assertTable(检查table里的某个cell中的值)、

assertNotEditable(检查指定的input是否不可以编辑)、

waitForElementPresent (等待检验某元素的存在。为真时,则执行。)

idea快捷键

http://gitlab.thunisoft.com/rdcdev1/FY_PRD_dianzijuanzong/wikis/idea快捷键

Alt+回车
导入包,自动修正

Ctrl+N
查找类

Ctrl+Shift+N
查找文件

Ctrl+Alt+L
格式化代码

Ctrl+Alt+O
优化导入的类和包


Alt+Insert

 

Ctrl+E或者Alt+Shift+C
最近更改的代码


Ctrl+R
替换文本


Ctrl+F
查找文本


Ctrl+Shift+Space
自动补全代码


Ctrl+空格
代码提示


Ctrl+Alt+Space
类名或接口名提示


Ctrl+P
方法参数提示


Ctrl+Shift+Alt+N
查找类中的方法或变量


Alt+Shift+C
对比最近修改的代码


Shift+F6
重构-重命名


Ctrl+Shift+先上键

 

Ctrl+X
删除行


Ctrl+D
复制行


Ctrl+/或Ctrl+Shift+/
注释(//或者/.../)


Ctrl+J
自动代码


Ctrl+E
最近打开的文件


Ctrl+H
显示类结构图


Ctrl+Q
显示注释文档


Alt+F1
查找代码所在位置


Alt+1
快速打开或隐藏工程面板


Ctrl+Alt+left/right
返回至上次浏览的位置


Alt+left/right
切换代码视图


Alt+Up/Down
在方法间快速移动定位


Ctrl+Shift+Up/Down
代码向上/下移动。


F2或Shift+F2
高亮错误或警告快速定位


代码标签输入完成后,按Tab,生成代码。

 

Ctrl+Shift+F7
高亮显示所有该文本,按Esc高亮消失。


Ctrl+W
选中代码,连续按会有其他效果


选中文本,按Alt+F3
逐个往下查找相同文本,并高亮显示。


Ctrl+Up/Down
光标跳转到第一行或最后一行下


Ctrl+B
快速打开光标处的类或方法

Selenium+Webdriver完整解决方案

  一、等待处理

  1.全局等待
  /*全局设置,当元素识别不到的时候,可以接受的最长等待时间。*/
  driver.manage()timeouts().implicitlyWait(30, TimeUnit.SECONDS);
  /*全局设置,页面加载的最长等待时间。*/
  driver.manage()timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
  /*全局设置,关于JavaScript代码的异步处理的超时时间。AJAX请求。*/
  driver.manage()timeouts().setScriptTimeout(30, TimeUnit.SECONDS);
  2.元素等待
public void waitForElement(By by) throws Exception{
for(int second = 1; second <= 30; second++){
try{
driver.findElement(by);
break;
}catch(Exception e){
System.out.println(e.getLocalizedMessage());
}
Thread.sleep(1000);
}
}
this.waitForElement(By.id("username"));//调用方法
  系统自带的方法:
  WebElement btnLogin = new WebDriverWait(driver, 10).until(
  ExpectedConditions.presenceOfElementLocated(By.id("login")));
  btnLogin.click();
  二、断言
  1.判断页面元素是否存在
public boolean waitForElement(By by) throws Exception{
boolean isExsit = false;
for(int second = 1; second <= 30; second++){
try{
driver.findElement(by);
isExist = true;
break;
}catch(Exception e){
System.out.println(e.getLocalizedMessage());
}
Thread.sleep(1000);
}
return isExist;
}
if(this.waitForElement(By.id("username"))){
}else{
}
  2.判断页面上的元素的值/内容
  String result = driver.findElement(By.id("msg")).getText();
  //对于内容的判断:
  //1.严格匹配:result.equals("")
  //2.模糊匹配:result.startsWith(""),result.endsWith, result.contains
  //3.正则表达式:result.matches("正则表达式 No=.*")
  if(result.contains("aaa")){
  }else{
  }
  3.直接读取数据库的内容
  String sql = "SELECT ID FROM USERNAME ORDER BY ID "
  int maxId =  thisgetMaxId(sql);
  int postEqual = result.indexOf("=");//取=号在字符串中的位置
  String newId= result.subString(postEqual + 1 );//从=号开始截取到最后,+1后移一位
  if(maxId == Integer.parseInt(newId)){
  }else{
  }
  三、新窗口处理
  1.对话框确认框的操作
  Alert alert = driver.switchTo().alert();
  alert.accept();  //点击确定
  alert.dismiss();  //点击取消
  2.新窗口的操作
//windowID切换
String loginID = driver.getWindowHandle();
for(String windowID : driver.getWindowHandles()){
if (!windowID.equals(loginID))
driver.switchTo.().window(windowID);
}
//windowTitle切换
for(String windowID : driver.getWindowHandles()){
driver.switchTo.().window(windowID);
Sring windowTitle =  driver.getTitle();
if(windowTitle.contains("部分标题")){
break;
}
}
  3.弹出窗口和Iframe
  driver.switchTo().frame("frameId");//切换到frame页面
  driver.switchTo().window("windowhandle");//切换回到主页面
  四、鼠标操作事件
private Actions action;
//单击-click
public void click(){
action.moveToElement(drvier.findElement(By.linkText("login"))).perform();
action.click().perform(); //action的调用后面一定要加上perform,才能保证能真正的运行。
}
//双击-
public void doubleClick(){
action.doubleClick(drvier.findElement(By.linkText("login"))).perform();
}
//右键-
public void rightClick(){
action.contextClick(drvier.findElement(By.linkText("login"))).perform();
}
//悬停-
public void mouseHold(){
action.clickAndHold(drvier.findElement(By.linkText("login"))).perform();
}
//拖拽-
public void dragDrop(){
WebElement source = drvier.findElement(By.linkText("login"))
WebElement target = drvier.findElement(By.linkText("login"))
action.dragAndDrop(source, target);
action.dragAndDropBy(source, 200, 300);
}
  五、键盘事件处理
  1.webDriver键盘操作-Action
  //webDriver键盘操作
  action.sendKeys("A").perform(); //按下键盘A
  action.sendKeys(Keys.Delete).perform();
  2.Java键盘操作-Robot
  //Java键盘操作
  //Java内含robot操作对象。throws Exception抛出异常给调用者。try{}catch(Excetion e){}//Excetion所有异常的父类,捕捉所有异常。
  public void robotUsage(){
  Robot robot = new Robot();
  robot.mousePress(InputEvent.BUTTON1_MASK); //鼠标左键点击
  robot.mouseRelease(InputEvent.BUTTON1_MASK); //鼠标左键释放
  robot.mousePress(keyEvent.VK_ENTER); //回车键
  robot.mouseRelease(keyEvent.VK_ENTER);
  }
 

一个很好的博客

http://www.cnblogs.com/tobecrazy/p/4553444.html 

Selenium Webdriver元素定位的八种常用方式

http://www.cnblogs.com/qingchunjun/p/4208159.html

 

Selenium2+python自动化38-显式等待(WebDriverWait)

http://blog.csdn.net/u011541946/article/details/69694510

posted @ 2017-11-27 14:29  车厘子123  阅读(559)  评论(0编辑  收藏  举报