2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Mac下配置ChromeDriver环境

ChromeDriver下载解压后,移动到 /usr/local/bin/ 目录下

浏览器常用方法

  • 打开网页:
driver.get("url")
driver.navigate().to("url")
  • 浏览器后退

driver.navigate().back();

  • 浏览器前进

driver.navigate().forward();

  • 浏览器刷新

driver.navigate().refresh();

  • 窗口最大化

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

  • 设置窗口大小
import org.openqa.selenium.Dimension;Dimension di = new Dimension(100, 100);
driver.manage().window().setSize(di);
  • 获取当前页面的URL

driver.getCurrentUrl()

  • 获取当前页面的title

driver.getTitle()

WebDriver定位方式

  • By.id、By.name、By.className、By.tagName
  • By.linkText: 根据超链接的文本定位
  • By.partialLinkText: 根据部分超链接文本定位,用于定位的文本要和其他超链接文本区分开
  • By.xpath:根据xpath定位,
  • By.cssSelector: 根据cssSelector定位

WebDriver常用方法

  • sendKeys:输入文本
  • getAttribute:获取属性值
  • clear:清空文本框
  • isDisplayed:判断元素是否显示
  • isEnabled:判断元素是否可用
  • isSelected:判断元素是否选中
  • System.setProperty:设置参数
  • getText:获取值
  • submit:提交表单
  • getWindowHandle: 获取窗口句柄

下拉列表

import org.openqa.selenium.support.ui.*;Select se = new Select(driver.findElement(By.id("")));
Actions ac = new Actions(driver);
ac.keyDown(Keys.SHIFT).click(se.getOptions().get(0)).click(se.getOptions().get(1)).keyUp(Keys.SHIFT).perform();
}

findElements 定位一组元素

findElements可以定位相同name或类名的一组元素

import java.uitl.List;List<WebElement> li = driver.findElements(By.className(""));
for(WebElement element: li) {System.out.println(element.getText())
}

iframe

iframe元素会创建包含另外一个文档的内联框架,定位iframe内的元素时,需要先切换到iframe,否则会出现找不到元素的问题

driver.switchTo().frame(driver.findElement(By.id("iframe_id")));
//也可以直接通过iframe的name或ID进行定位
//driver.switchTo().frame("iframe_id_or_name");
driver.findElement(By.id(""))   //定位iframe内的元素
//完成当前表单操作后,需要返回上一级表单
driver.switchTo().defaultContent();

标签无法定位的解决办法

QQ邮箱收件人地址输入框,通过input标签定位时,找不到元素,在网上找的其他解决办法。 思路是通过Actions点击元素,然后输入内容

import org.openqa.selenium.interactions.ActionsActions ac = new Actions(dirver);
WebElement el = driver.findElement(By.id(""));
ac.click(el).sendKeys("").perform();

java执行外部程序或批处理命令

Runtime.getRuntime().exec("command")

截图,保存文件

//保存文件用到了FileUtils类,需要下载jar包
//地址:http://commons.apache.org/proper/commons-io/download_io.cgi
//把commons-io-2.4.jar 这个文件导入到你的项目中
import org.apache.commons.io.FileUtils;File screenShot = ((TakesScreenshot) driver).getScreenshotAs(OutputType.File);
try {FileUtils.copyFile(screenShot, new File("save_path.png"));
}catch (IOException e) {e.printStackTrace();
}

弹框处理

警告框 alert

警告框经常用于确保用户可以得到某些信息。 当警告框出现后,用户需要点击确定按钮才能继续进行操作

import org.openqa.selenium.Alert;Alert alert = driver.switchTo().alert();
alert.accept(); //点击警告框的确认按钮

确认框 confirm

确认框用于使用户可以验证或者接受某些信息。 当确认框出现后,用户需要点击确定或者取消按钮才能继续进行操作。

import org.openqa.selenium.Alert;Alert alert = driver.switchTo().alert();
alert.accept(); //点击确认按钮
alert.dismiss();    //点击取消按钮

提示框 prompt

提示框经常用于提示用户在进入页面前输入某个值。 当提示框出现后,用户需要输入某个值,然后点击确认或取消按钮才能继续操纵。

import org.openqa.selenium.Alert;Alert alert = driver.switchTo().alert();
alert.sendKeys(""); //提示框中输入值
alert.accept(); //点击确认按钮
alert.dismiss();    //点击取消按钮

多窗口处理

webDriver的switchTo().window()可以在多个窗口直接切换

WebDriver driver = new ChromeDriver();
driver.get("http://www.sina.com.cn/");Thread.sleep(5000);
String mainWindowHandle = driver.getWindowHandle();// 打开其他链接
driver.findElement(By.linkText("体育")).click();
driver.findElement(By.linkText("娱乐")).click();Set<String> set = driver.getWindowHandles();
for (String handle: set) {if(handle.equals(mainWindowHandle)) {driver.switchTo().window(mainWindowHandle);Thread.sleep(2);driver.close();break;}
}

元素等待

强制等待 Thread.sleep()

优点:使用简单 缺点:不能准确的掌握等待时间,大量使用会浪费时间,影响执行效率

Thread.sleep(2000); //休眠2S,单位是毫秒

隐式等待 implicitly_wait

设置一个最长的等待时间,如果在等待时间内页面加载完成,执行下一步,否则一直等到时间结束,然后执行下一步操作 只需设置一次,设置之后,在WebDriver对象实例整个生命周期都起作用 缺点:如果所需的页面元素已经加载完成,但整个网页还没有加载完成,仍要等待整个页面加载完成或超时才做执行下面的操作

driver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS)

显式等待 WebDriverWait

以某个元素是否显示或点击作为等待的条件,更精准的控制等待时间

new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id(""))));

使用ExpectedConditions类中自带方法, 可以进行显试等待的判断。

  • 页面元素是否在页面上可用和可被单击: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)

Actions类

Actions类提供了鼠标和键盘点击的行为

import org.openqa.selenium.interactions.ActionsActions action = new Actions(driver);
WebElemen element = driver.findElement(By.id(""));

鼠标点击

//单击
action.click(element).perform()
//右键
action.contextClick(element).perform()
//双击
action.doubleClick(element).perform()
//鼠标悬停,点击后不释放
action.clickAndHold(driver.findElement(By.id(""))).perform()

鼠标移动

//鼠标移动到元素上
action.moveToElement(element).perform();

元素移动

//将element1移动到element2位置上
action.dragAndDrop(element1, element2).perform();
//将element移动到(200,200)位置
action.dragAndDropBy(element, 200, 200).perform();

键盘输入

//输入abc然后按回车键
ac.sendKeys("abc").sendKeys(Keys.ENTER).perform();//组合按键
ac.keyDown(Keys.SHIFT).sendKeys("a").keyUp(Keys.SHIFT).perform();
ac.sendKeys(Keys.chord(Keys.SHIFT, "a")).perform();

下拉框多选

Select se = new Select(driver.findElement(By.id("")));
ac.keyDown(Keys.SHIFT).click(se.getOptions().get(0)).click(se.getOptions().get(1)).keyUp(Keys.SHIFT).perform();

Robot类

Robot robot = new Robot();
robot.setAutoDelay(300);
robot.keyPress(KeyEvent.VK_A);
robot.keyRelease(KeyEvent.VK_A);

转载于:https://my.oschina.net/mexiaobai1315/blog/3009267

selenium3 + java 日志相关推荐

  1. java 日志 生成_Java日志(转)

    日志对于一个系统来说非常重要,查找异常信息.分析系统运行情况等都需要用到日志.所以无论是JDK还是第三方都提供了关于日志的相关工具,本文分别介绍以下几种工具,以及各种工具间的整合.原理. JDK的ja ...

  2. Java 日志体系详解

    欢迎关注方志朋的博客,回复"666"获面试宝典 本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用.依赖,好让我们平时在工作中如果遇到"日志打不出&qu ...

  3. Java日志体系权威总结

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 来源:http://r6d.cn/MSaE 概要 本文的目 ...

  4. Java日志的心路历程

    大家好,我是头发还很多的阿星 今天来和大家聊聊Java日志体系,Java日志体系可以说是五花八门,眼花缭乱. 导致很多小伙伴因为日志标准库之间复杂的关系而感到烦恼,不知道统一系统的日志标准库需要依赖哪 ...

  5. Java日志体系总结

    概要 本文的目的是搞清楚Java中各种日志Log之间是怎么的关系,如何作用.依赖,好让我们平时在工作中如果遇到"日志打不出"或者"日志jar包冲突"等之类的问题 ...

  6. 各种Java日志框架的比较

    2019独角兽企业重金招聘Python工程师标准>>> Log4j Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台.文件.GUI组件. ...

  7. java日志统一集成的两种方案

    slf4j架构 Log4j日志集成 Logback日志集成 总结 分享的目的 一次性的解决应用中日志遇到的各种问题,包括:消除应用启动过程中与日志系统相关的无用错误提示,日志打印不出来的问题等: Sl ...

  8. Java 日志缓存机制的实现--转载

    概述 日志技术为产品的质量和服务提供了重要的支撑.JDK 在 1.4 版本以后加入了日志机制,为 Java 开发人员提供了便利.但这种日志机制是基于静态日志级别的,也就是在程序运行前就需设定下来要打印 ...

  9. Java日志性能那些事

    在任何系统中,日志都是非常重要的组成部分,它是反映系统运行情况的重要依据,也是排查问题时的必要线索.绝大多数人都认可日志的重要性,但是又有多少人仔细想过该怎么打日志,日志对性能的影响究竟有多大呢?今天 ...

最新文章

  1. linux通过platform_match()匹配platform总线上的device和driver
  2. Redis list(列表)
  3. 为什么要学习python
  4. Think in Java读书笔记--隐藏实施过程
  5. 【vue】跟着老马学习vue-数据双向绑定
  6. #2002 - 服务器没有响应 (or the local MySQL server's socket is not ...
  7. Linux网络防火墙:iptables与netfilter
  8. python基础知识-Python基础知识点总结
  9. JAVA线程池shutdown和shutdownNow的区别
  10. 39个SEO经典案例
  11. 通信工程师考试新手报考指南
  12. Xbox360 手柄通过网络远程控制树莓派
  13. Selenium结合HttpWatch进行Web自动化测试(实时获取页面性能)
  14. mybatis 中between and用法
  15. sub 对应php什么函数,subtotal函数的使用方法1-9分别什么意思
  16. 屏幕录制软件 Camstudio
  17. Bwsaas多端SAAS平台运营系统源码v1.1.1
  18. 对数函数定义域和值域_对数函数的定义域,值域是怎么求的
  19. python做兼职_“隐形贫困者”自学Python做副业,教你如何月入10000+
  20. 深度学习——几种学习类型

热门文章

  1. fjblog佛教博客不错
  2. 动手学深度学习(PyTorch实现)(十)--NiN模型
  3. 一起来玩树莓派--在docker内安装conda(python3.6)
  4. 东华理工大学arm试卷_ARM东华理工大学2015-2016试卷A
  5. java 扫雷游戏_java的扫雷小游戏(超简单)
  6. 微信公众平台开发(150)——从新浪云SAE上传图片到图文消息
  7. 微信内打开的网页不能下载APP,微信无法打开浏览器访问指定页面的解决方案...
  8. GNU-Radio USRP Example
  9. mongodb----副本集搭建及故障自动切换
  10. iOS内存管理系列之一:对象所有权与引用计数