UI“三重天”之selenium--常用API和问题处理(三)
Selenium常用API:
前面两篇示例代码中用到了一些selenium的API方法,例如定位元素的八种方法、访问url、等待、操作浏览器、获取title、点击、清理等等。
有关于selenium的常用API在园子中有写的非常详细的文章。先贴大佬文章地址:https://www.cnblogs.com/Ming8006/p/5727542.html#c1.5。
对于几种用的比较多的地方再记录一下:
等待:
显式等待:等待条件成立,再继续执行
示例代码中含有显式等待:
// Google's search is rendered dynamically with JavaScript.
// Wait for the page to load, timeout after 10 seconds
(new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() {
public Boolean apply(WebDriver d) {
return d.getTitle().toLowerCase().startsWith("cheese!");
}
});
官方文档说明:An explicit wait is code you define to wait for a certain condition to occur before proceeding further in the code. The worst case of this is Thread.sleep(), which sets the condition to an exact time period to wait. There are some convenience methods provided that help you write code that will wait only as long as required. WebDriverWait in combination with ExpectedCondition is one way this can be accomplished.【一句话概括“等待条件发生,再继续执行的代码”】
WebDriver driver = new FirefoxDriver();
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("myDynamicElement")))
在抛出TimeoutException之前最多等待10s,或者在10s发现元素则返回。ExpectedCondition函数返回类型为true或非null对象。
在实例中无需实例化:
WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.elementToBeClickable(By.id("someid")));
隐式等待:通过设定的时长等待页面元素加载完成,再执行;如果超过设定时间,则继续执行。
官方文档示例代码:
WebDriver driver = new FirefoxDriver();
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("http://somedomain/url_that_delays_loading");
WebElement myDynamicElement = driver.findElement(By.id("myDynamicElement"));
隐式等待方法关键字:implicitlyWait,直接调用即可。
该实例等待10s,10s内元素加载完成则继续。
强制等待:lang包下的Thread.sleep()方法,该方法应该也是debug用的最多的一种。
鼠标悬浮:
在定位元素时,通常有些元素需要执行鼠标悬浮操作。
使用action包下perform方法:
//鼠标悬浮
public void hover(String xpath) {
Actions action = new Actions(driver);
try {
action.moveToElement(driver.findElement(By.xpath(xpath))).perform();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
文件上传:
文件上传可直接使用sendkeys传入需要上传文件的本地路径即可。
切记:使用该方法,定位到的元素该标签必须是input类型、type=file属性,满足该条件即可用到该方法。
driver.findElement(By.xpath(xpath)).sendKeys(filePath);
filepath为本地文件路径及文件名。
截图:
通常执行自动化测试脚本并非一帆风顺,或者发现流程上的一些错误等等,这个时候便需要增加一些截图,执行完成之后人为进行检查。
官方文档给出了示例代码:
import java.net.URL; import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.Augmenter;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver; public class Testing { public void myTest() throws Exception {
WebDriver driver = new RemoteWebDriver(
new URL("http://localhost:4444/wd/hub"),
DesiredCapabilities.firefox()); driver.get("http://www.google.com"); // RemoteWebDriver does not implement the TakesScreenshot class
// if the driver does have the Capabilities to take a screenshot
// then Augmenter will add the TakesScreenshot methods to the instance
WebDriver augmentedDriver = new Augmenter().augment(driver);
File screenshot = ((TakesScreenshot)augmentedDriver).
getScreenshotAs(OutputType.FILE);
}
}
可以看的出该处用到的是augment,中间的注释指的是如果驱动程序确实有能力进行截屏,然后Augmenter会将TaksCyEnScript方法添加到实例中。
调用JS:
有时候需要利用JS来执行赋值、点击操作等。
使用的是JavascriptExecutor,copy一下上方链接那位大佬的示例代码。
private static void runJSTest1(WebDriver driver) throws InterruptedException {
String js ="alert(\"hello,this is a alert!\")";
((org.openqa.selenium.JavascriptExecutor) driver).executeScript(js);
Thread.sleep(2000);
} private static void runJSTest2(WebDriver driver)
throws InterruptedException {
driver.get("https://www.baidu.com/");
String js ="arguments[0].click();";
driver.findElement(By.id("kw")).sendKeys("JAVA");
WebElement searchButton = driver.findElement(By.id("su"));
((org.openqa.selenium.JavascriptExecutor) driver).executeScript(js,searchButton);
Thread.sleep(2000);
}
浏览器滚动:
一样使用的是JavascriptExecutor。
JavascriptExecutor js = (JavascriptExecutor)driver;
String jscmd = "window.scrollTo(0," + height + ")";
js.executeScript(jscmd);
进入iframe子页面:
通常一些元素会在iframe的标签下,那么便需要进入iframe再进行定位:
WebElement frame = driver.findElement(By.xpath());
driver.switchTo().frame();
下拉框:
针对下拉框selenium使用select。
Select userselect = new Select(driver.findElement(By.xpath()));
userselect.selectByVisibleText();
切换浏览器窗口:
webdriver中包含getWindowHandles方法。通过窗口标题去判断切换浏览器的窗口
public void switchWindow(String target) {
//创建 一个字符串便于之后存放句柄
String s = null;
//获取当前界面中的句柄
Set<String> handles = driver.getWindowHandles();
//循环尝试,找到目标浏览器的句柄
for(String t :handles) {
//遍历每一个句柄,判断窗口的标题是否含有预期字符
System.out.println(t);
if (driver.switchTo().window(t).getTitle().equals(target)) {
s = t;
}
}
//切换到目标句柄的界面中
try {
driver.switchTo().window(s);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
加载cookie:
//addcookie方法
driver.manage.addcookie()
//使用option读取用户文件,本地路径
ChromeOptions o = new ChromeOptions();
o.addArguments(“本地路径”)
后续~~~~
UI“三重天”之selenium--常用API和问题处理(三)的更多相关文章
- Selenium Web 自动化 - Selenium常用API
Selenium Web 自动化 - Selenium常用API 2016-08-01 目录 1 对浏览器操作 1.1 用webdriver打开一个浏览器 1.2 最大化浏览器&关闭浏览器 ...
- Selenium常用API详解介绍
转至元数据结尾 由 黄从建创建, 最后修改于一月 21, 2019 转至元数据起始 一.selenium元素定位 1.selenium定位方法 2.定位方法的用法 二.控制浏览器操作 1.控制 ...
- 详解介绍Selenium常用API的使用--Java语言(完整版)
参考:http://www.testclass.net/selenium_java/ 一共分为二十个部分:环境安装之Java.环境安装之IntelliJ IDEA.环境安装之selenium.sele ...
- java selenium常用API(WebElement、iFrame、select、alert、浏览器窗口、事件、js) 一
WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.clic ...
- java selenium常用API汇总
(WebElement.iFrame.select.alert.浏览器窗口.事件.js) 一 WebElement相关方法 1.点击操作 WebElement button = driver. ...
- Selenium2(java)selenium常用API 四
WebElement相关方法 1.点击操作 WebElement button = driver.findElement(By.id("login")); button.click ...
- Selenium常用API用法示例集----下拉框、文本域及富文本框、弹窗、JS、frame、文件上传和下载
元素识别方法.一组元素定位.鼠标操作.多窗口处理.下拉框.文本域及富文本框.弹窗.JS.frame.文件上传和下载 元素识别方法: driver.find_element_by_id() driver ...
- UI“三重天”之Selenium(一)
关注一下UI自动化,记一记笔记. UI自动化的优缺点: 关于UI自动化的优缺点想来大家都有了解,优点:解放人力(并不是完全解放),用机器(涵盖工具.脚本等)代替人工完成测试工作,将测试用例转化为脚本实 ...
- Selenium常用API的使用java语言之19-调用JavaScript代码
虽然WebDriver提供了操作浏览器的前进和后退方法,但对于浏览器滚动条并没有提供相应的操作方法.在这种情况下,就可以借助JavaScript来控制浏览器的滚动条.WebDriver提供了execu ...
随机推荐
- Scikit-learn 库的使用
1. 与文本处理相关的库 1. 对语料库提取特征词集合 from sklearn.feature_extraction.text import TfidfVectorizer, CountVector ...
- UVa 1637 纸牌游戏(全概率公式)
https://vjudge.net/problem/UVA-1637 题意: 36张牌分成9堆,每堆4张牌.每次可以拿走某两堆顶部的牌,但需要点数相同.每种拿法的概率均为1/5.求成功概率. 思路: ...
- MQ是什么 RabbitMQ
一.rabbitMQ是什么: RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上. 学过websocket的来理解rabbitMQ应该是 ...
- POJ 2411 状压DP经典
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 16771 Accepted: 968 ...
- Ubuntu 分区方安
方案一: / 40G/boot 200MBswap 1G-2G /home 20G 剩 下的分为几个独立的分区,不用指定挂载点,而是安装完成后修改 /etc/fstab ,将这些区挂载在/home的子 ...
- docx文件怎样打开 - 转
如何打开docx文件?在office2007及2010退出多年后,诸如docx.xlsx.pptx类文件越来越多,我们从网络下载或者别人复制过来的这类文件越来越多.docx文件怎样打开呢?下面有图小站 ...
- Linux 网络编程->epoll<-LT/ET模式整理(~相逢何必曾相识~)
今天自己整理一下epoll,网上有很多经典的介绍,看了很多~收藏了很多~还是整理一下做个积累, 自己的东西好找~ 1. epoll 模型简介 epoll 是Linux I/O 多路复用接口 selec ...
- [爬虫] 学Scrapy,顺便把它的官方教程给爬下来
想学爬虫主要是因为算法和数据是密切相关的,有数据之后可以玩更多有意思的事情,数据量大可以挖掘挖掘到更多的信息. 之前只会通过python中的request库来下载网页内容,再用BeautifulSou ...
- yaf 整理札记
由于yaf只是一个web框架,只负责处理web请求之类的基本功能,相当简洁,连db库都没有.于是试着把zend 2.2的db库,form库,validator库与yaf结合,写了一个demo.因为ze ...
- threejs 通过bufferGeometry处理每一个点的位置和颜色
let positions = new Float32Array(points.length * 3); let colors = new Float32Array(points.length * 3 ...