Selenium常用API及常用等待方式介绍
WebElement常用API
-
click()
触发当前元素的点击事件
写法:
driver.findElement(By.id("su")).click(); // 点击百度一下
-
clear()
清空内容
写法:
driver.findElement(By.id("kw")).clear(); // 清除百度输入框中的内容
-
sedKeys(……)
1、往文本框一类元素中写入内容
element.sendKeys("百度"); //输入内容”百度”
写法:
driver.findElement(By.id("kw")).sendKeys("百度");
2、按键操作
element.sendKeys(Keys.CONTROL,"a");//ctrl+a 全选 element.sendKeys(Keys.CONTROL,"x");//ctrl+x 剪切 element.sendKeys(Keys.CONTROL,"c");//ctrl+c 复制 element.sendKeys(Keys.CONTROL,"v");//ctrl+v 粘贴 element.sendKeys(Keys.ENTER);//回车 element.sendKeys(Keys.BACK_SPACE);//删除 element.sendKeys(Keys.SPACE);//空格键
Demo:
@Test public void testDemo() throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("https://www.baidu.com"); driver.findElement(By.id("kw")).clear(); driver.findElement(By.id("kw")).sendKeys("百度"); Thread.sleep(2000); // 全选中百度,然后复制 driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "a"); driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "c"); // 复制粘贴,粘贴两次方便演示 for (int i=0; i<2; i++){ driver.findElement(By.id("kw")).sendKeys(Keys.CONTROL, "v"); } // 回车 driver.findElement(By.id("kw")).sendKeys(Keys.ENTER); driver.quit(); }
-
getTagName()
获取元素的标签名
写法:
String su = driver.findElement(By.id("su")).getTagName(); System.out.println("The tagName of element is " + su);
-
getAttribute(属性名)
根据属性名获取元素属性值
写法:
String attribute = driver.findElement(By.id("su")).getAttribute("value"); System.out.println("The attribute of element is " + attribute);
-
getText()
获取当前元素的文本值
写法:
String text = driver.findElement(By.cssSelector("#hotsearch-refresh-btn > span")).getText(); System.out.println("The text of element is " + text);
WebDriver常用API
-
get(String url)
访问指定url页面
driver.get(String url);
写法:
driver.get("https://www.baidu.com");
-
getCurrentUrl()
获取当前页面的url地址driver.getCurrentUrl();
写法:
String currentUrl = driver.getCurrentUrl(); System.out.println("currentUrl: " + currentUrl);
-
getTitle()
获取当前页面的标题driver.getTitle();
写法:
String title = driver.getTitle(); System.out.println("title: " + title);
-
getPageSource()
获取当前页面源代码driver.getPageSource();
写法:
String pageSource = driver.getPageSource(); System.out.println("pageSource: " + pageSource);
-
quit()
关闭驱动对象以及所有相关的窗口driver.quit();
-
close()
关闭当前窗口driver.close();
Demo:
@Test public void testDemo throws InterruptedException { WebDriver driver = new ChromeDriver(); driver.get("https://www.baidu.com"); WebDriverWait wait = new WebDriverWait(driver, 10); // 点击新闻 wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#s-top-left > a:first-child"))).click(); Thread.sleep(3000); // 关闭当前窗口 driver.close(); // 退出会话,关闭浏览器 driver.quit(); }
-
navigate对象 -- 导航栏
关于浏览器的基本功能操作,大部分都是由navigate对象提供的,如完成浏览器回退或者导航到指定url页
面等操作//获取navigate对象 Navigation navigation = driver.navigate(); //访问指定的url地址 navigation.to(url); //刷新当前页面 navigation.refresh(); //浏览器回退操作 navigation.back(); //浏览器前进操作 navigation.forward();
Demo:
@Test public void testDemo() throws InterruptedException { WebDriver driver = new ChromeDriver(); //获取navigate对象 Navigation navigation = driver.navigate(); // 打开百度地址 navigation.to("https://www.baidu.com"); // 搜索百度 driver.findElement(By.cssSelector("#kw")).sendKeys("百度"); driver.findElement(By.id("kw")).sendKeys(Keys.ENTER); Thread.sleep(3000); //刷新当前页面 navigation.refresh(); Thread.sleep(3000); //浏览器回退操作 navigation.back(); Thread.sleep(3000); //浏览器前进操作 navigation.forward(); Thread.sleep(3000); // 退出会话,关闭浏览器 driver.quit(); }
-
window基本操作
关于窗口的设置,基本都是由window对象提供的//获取window对象 Window window = driver.manage().window(); //窗口最大化 window.maximize(); //浏览器全屏 window.fullscreen(); //窗口位置 window.getPosition(); //窗口大小 window.getSize(); //设置位置 window.setPosition(targetPosition); //设置窗口大小 window.setSize(targetSize);
Demo:
@Test public void testDemo(){ WebDriver driver = new ChromeDriver(); driver.get("https://www.baidu.com"); Window window = driver.manage().window(); // 最大化 window.maximize(); // 浏览器全屏 window.fullscreen(); // 窗口位置 Point position = window.getPosition(); System.out.println("获取的窗口位置是: " + position); System.out.println("x轴的位置:" + position.getX()); System.out.println("y轴的位置:" + position.getY()); // 获取窗口大小 Dimension size = window.getSize(); System.out.println("获取的窗口大小为: " + size); System.out.println("窗口的宽度:" + size.getWidth()); System.out.println("窗口的高度:" + size.getHeight()); // 移动窗口位置 position.move(108, 44); System.out.println("移动后,获取的窗口位置是: " + position); System.out.println("移动后,x轴的位置:" + position.getX()); System.out.println("移动后,y轴的位置:" + position.getY()); // 修改窗口大小(分辨率) window.setSize(new Dimension(1000, 800)); Dimension size1 = window.getSize(); System.out.println("修改后,获取的窗口大小为: " + size1); System.out.println("窗口的宽度:" + size1.getWidth()); System.out.println("窗口的高度:" + size1.getHeight()); // 退出会话,关闭浏览器 driver.quit(); }
等待方式介绍
1、强制等待
Thread.sleep(long millis);
优点:使用简单
缺点:容易造成时间浪费
2、隐式等待
在设置的超时时间范围内不断查找元素,直到找到元素或者超时为止
注:不要混合隐式和显式等待。这样做会导致不可预测的等待时间。例如,设置 10 秒的隐式等待和 15 秒的显式等待可能会导致 20 秒后发生超时
如:设置等待时间为5秒,在第3秒找到元素,不再继续等待
设置方式
driver.manage.timeouts().implicitlyWait(long time, TimeUnit unit);
优点:相对灵活
缺点:
- 设置是针对全局的,在WebDriver实例整个生命周期有效,但并不是所有的元素都需要等待
- 只能等待元素存在,不能适用条件更复杂的情况,如:元素可点击、元素可见
3、显示等待
显式等待通常是我们自定义的一段代码,用来等待某个条件发生后再继续执行后续代码(如元素存在、元素
可点击、元素可见等)
使用方式:
WebDriverWait wait = new WebDriverWait();
WebElement element = wait.until(expectCondition)
优点:
每隔一段时间扫描一次页面,检查元素是否满足等待结果条件,比如查找元素,则检查元素是否存在,不存
在则继续等待,直到找到或超时。
该方式不是全局设置,因此特定需要等待的元素可以这样处理,推荐优先使用这一种方法。
方法 | 等待条件 |
---|---|
presenceOfElementLocated | 页面元素在页面中存在 |
visibilityOfElementLocated | 页面元素在页面存在并且可见 |
elementToBeClickable | 页面元素是否在页面上可被单击 |
4、流畅等待
FluentWait的定义
简单来说,FluentWait就是一个普通的类,我们使用这个类能支持一直等待直到特定的条件出现。
1)是一个类而且是包org.openqa.selenium.support.ui的一部分
2)是Wait接口的一种实现
3)每个Fluent wait,我们可以设置等待最大时间,而且可以做设置等待的频率去检查一些特定的条件。
// Waiting 30 seconds for an element to be present on the page, checking
// for its presence once every 5 seconds.
Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
WebElement foo = wait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) {
return driver.findElement(By.id("foo"));
}
});
优点:
FluentWait 实例可以定义等待条件的最长时间,以及检查条件的频率。用户可以将等待配置为在等待时忽略特定类型的异常,例如NoSuchElementException
在页面上搜索元素时。
FluentWait 和 显示等待的区别:简单来说就是显示等待里有一些设定好了的前置条件的等待方式,而Fluent wait你可以设置自己的方法去处理各种等待的问题。