【基础5】Selenium常用API

时间:2022-02-27 22:07:38

WebElement的相关方法

来自官网的WebElement=》method说明
【基础5】Selenium常用API

//范例
package seleniumdemo;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo1 {

public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//设置隐式等待
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);


//演示=》WebElement的method

driver.get("http://www.baidu.com");
WebElement searchInput = driver.findElement(By.id("kw"));
searchInput.sendKeys("java");//输入框中输入内容“java”
searchInput.clear();//清空搜索框中的内容
searchInput.sendKeys("selenium");
System.out.println(searchInput.getText());//将搜索框中的内容打印出来
System.out.println(searchInput.getAttribute("id"));
System.out.println(searchInput.isEnabled());//searchInput这个对象在页面中是否灰置
System.out.println(searchInput.isDisplayed());//searchInput这个对象是否显示在页面中
System.out.println(searchInput.getLocation());//获取当前元素在当前网页中的位置
System.out.println(searchInput.getSize());//获得当前元素的尺寸
WebElement searchBtn = driver.findElement(By.id("su"));
searchBtn.click();//这里的type=“submit”,所以这里也可以使用"searchBtn.submit();"语句代替
driver.quit();//driver使用完之后必须关闭
}
}

设置浏览器窗口大小

package seleniumdemo;

import org.openqa.selenium.Dimension;
import org.openqa.selenium.Point;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo1 {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//设置当前窗口最大化
driver.manage().window().maximize();
//让当前线程睡3秒,方便大家观察
Thread.sleep(3000);
//设置当前窗口的位置
Point point01 = new Point(100, 100);
driver.manage().window().setPosition(point01);
Thread.sleep(3000);
//设置当前窗口的大小
driver.manage().window().setSize(new Dimension(200, 200));
Thread.sleep(3000);
driver.quit();
}
}

操作浏览器前进后退

System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http:\\www.baidu.com");
driver.get("https://www.2345.com/");
Thread.sleep(3000);
//后退
driver.navigate().back();
Thread.sleep(3000);
//前进
driver.navigate().forward();
Thread.sleep(3000);
driver.quit();

cookie操作

注意cookie的构成,默认情况下使用new Cookie(String name, String value)来创建的cookie对象。

driver.manage().addCookie(new Cookie("dami","heting"));
System.out.println(driver.manage().getCookieNamed("dami"));

输出:

dami=heting; path=/; domain=www.baidu.com

selenium操作cookie范例

package seleniumdemo;

import org.openqa.selenium.Cookie;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo1 {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
//driver.manage().getCookies():获取全部的cookies
System.out.println(driver.manage().getCookies());
//addCookie:为当前的driver实例添加cookie
driver.manage().addCookie(new Cookie("name","heting"));
//getCookieNamed("name"):根据参数cookie name 获得cookie
System.out.println(driver.manage().getCookieNamed("name"));
//deleteCookieNamed("name"):根据参数cookie name 删除cookie
driver.manage().deleteCookieNamed("name");
//deleteAllCookies();删除多有的cookie
driver.manage().deleteAllCookies();
driver.quit();
}
}

iFrame的处理

package seleniumdemo;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo1 {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.w3school.com.cn/tiy/t.asp?f=html_form_radio");
//方式1:driver.switchto().frame(String arg0):这里的参数可以是iframe中name或者id的值
//driver.switchTo().frame("i");
//方式2:driver.switchto().frame(Webelement arg0):这里的参数是iframe这个WebElement对象
//driver.switchTo().frame(driver.findElement(By.cssSelector("div>iframe")));
//方式3:driver.switchto().frame(int arg0):参数表示这里的iframe在页面中是第几个,0表示第一个,1表示第二个,以此类推
driver.switchTo().frame(1);

List<WebElement> elements = driver.findElements(By.tagName("input"));
System.out.println(elements.size());
System.out.println(elements.get(0).getText());
System.out.println(elements.get(0).getTagName());

//回到默认的Content中
//driver.switchTo().defaultContent();

//回到父类的iframe中:如果没有成层嵌套iframe,效果和driver.switchto().defaultContent()一样
driver.switchTo().parentFrame();
System.out.println(driver.findElement(By.id("TestCode")).getText());

driver.quit();
}
}

操作下拉菜单Select

思路是:先定位到你要处理的下拉框(WebElement),然后将这个元素传递给Select对象中,接着用Select对象的方法来选取下拉框
这里以2345网页的天气预报为范例进行演示
【基础5】Selenium常用API

package seleniumdemo;


import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.Select;

public class demo1 {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
//设置隐式等待10
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://www.2345.com/");
//找到“切换”天气预报的元素并点击
driver.findElement(By.id("J_city_switch")).click();
//城市的选择在一个iframe中,现在我们要进入到id为“city_set_ifr”的iframe中才可以对城市进行定位
driver.switchTo().frame("city_set_ifr");
//选择“省”下拉框元素,然后将元素传入Select对象中
Select s_province = new Select(driver.findElement(By.id("province")));

//通过index下标选择option
s_province.selectByIndex(0);
//通过option元素的“value”属性值定位option
s_province.selectByValue("10");
//通过option元素显示的text定位option
s_province.selectByVisibleText("A 安徽");

driver.quit();
}
}

处理Alert,提示框和确认框

Web前端开发人员通常需要利用JavaScript弹出对话框来给用户一些提示信息,包括以下几种类型:
1)警告框:用于提示用户相关信息的验证结果,错误或者警告等=》alert("我是一个消息框!")
2)提示框:用于提示用户在当前对话框中输入数据,一般需要用户单击取消或者确认按钮=》prompt("Please enter your name","")
3)确认框:用户提示用户确认或者取消某个操作,一般需要用户单击取消或者确认按钮=》confirm("Press a button")
selenium专门提供了一个AlertAPI来处理对话框。使用方法Alert alert = driver.switchTo().alert();使用这个方法可以获取到当前页面弹出的对话框,然后利用Alert的相关method对对话框进行操作。

  • alert.getText();获取弹出框的文本内容
  • alert.sendKeys(“this is Learning Selenium”);向弹出框中输入字符串
  • alert.accept();模拟点击确定按钮
  • alert.dismiss();模拟点击取消按钮

处理浏览器弹出的新窗口

我们在一个页面中,点击一个链接会打开一个新的窗口,那么我们怎么才能跳转到新的窗口中并对新窗口中的对象进行操作呢?selenium也提供了相关的api来进行操作。首先我们需要了解的是,每个窗口都有一个叫句柄的标识符,我们可以利用句柄对作为标识符在窗口中进行任意切换。

范例如下:

package seleniumdemo;

import java.util.Set;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class demo1 {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("https://www.2345.com/");
//获取当前窗口的句柄
String default_handle = driver.getWindowHandle();
//点击弹出新窗口:百度
driver.findElement(By.cssSelector(".menu-hd.J_bd")).click();
//获取当前driver的所有窗口的句柄
Set<String> handles = driver.getWindowHandles();
String baidu_handle = null;
for(String handle:handles){
if(default_handle == handle){
continue;
}else {
baidu_handle = handle;
}
}
//跳转到新窗口
driver.switchTo().window(baidu_handle);
System.out.println(driver.getCurrentUrl());
//回到旧窗口
driver.switchTo().window(default_handle);
System.out.println(driver.getCurrentUrl());
driver.quit();
}
}

操作弹出窗口之获取标题

driver.getTitle();
System.out.println(driver.getTitle().contains("百度"));

执行js脚本

有的时候我们需要js帮助我们执行一些操作,比如js赋值,点击操作等

范例1:

String jS = "alert(\"你好\")";
((JavascriptExecutor)driver).executeScript(jS);

范例2:

//((JavascriptExecutor) driver).executeScript(String js, Object args);第一个参数是js脚本,第二个参数是你要操作的元素
((JavascriptExecutor) driver).executeScript(“arguments[0].click();”, driver.findElement(By.id(“su”)));

等待元素加载

1.硬性等待

Thread.sleep(3000);

Thread.sleep(int sleeptime):此方法会把当前的线程暂停一段时间,然后再执行接下来的操作。这个方法有一个缺点就是,你不能确定元素到底多久加载出来,如果你的sleepTimes是10秒,但是元素2秒就加载出来了,但是当前线程还是会继续等待8秒,造成时间浪费,所以非必要情况下不要使用这个方法

2.隐式等待

注意:我们一般使用都是用隐式等待
原理:隐式等待,就是我们在创建driver的时候,为浏览器对象设置一个等待时间。这个方法是针对全局的,是指得不到某个元素就等待一段时间,知道拿到某个元素的位置。
注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的检查页面去寻找我们需要的元素。

//隐式等待的语法:
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);//隐式等待一般设置为30秒

这里有一个问题:如果我们设置了隐式等待,在我们判断一个元素是否存在的时候就会遇到很坑爹的问题。
那么我们怎么处理上面的问题呢?=》当我们需要判断一个元素是否存在的时候,重新设置隐式等待,将等待时间设置小一点就可以了,否则本来页面中就不存在这个元素,我们找不到的时候又因为设置了隐式等待,你就会觉得程序的执行速度不是一般的慢。

public boolean isElementPresent(By by) {
try {
driver.manage().timeouts().implicitlyWait(1, TimeUnit.SECONDS);
driver.findElement(by);
return true;
} catch (NoSuchElementException e) {
return false;
}
}

3.显示等待(后续补充)

原理:就是明确的要等到某个元素的出现或者是某个元素的可点击等条件,等不到,就一直等,除非在规定的时间之内都没有找到,那么就跳出Exception(简而言之:就是等待元素出现才去操作,如果超时则报异常)
需要使用到ExpectedCondition(预置条件),WebDriverWait,具体=》看书吧,这里我也没有理解的特别清楚

设置等待页面元素加载完毕

有时候我们打开一个网页,网页加载速度比较慢,我们又想等网页加载完全之后再执行操作,怎么办?

int pageLoadTime = 10;
driver.manage().timeouts().pageLoadTimeout(pageLoadTime,TimeUnit.SECONDS);

加载页面的时候会给你一个时间(也就是第一个参数),如果超出了这个时间页面还没有加载完成,则报错,如果小于给定的时间内加载完成,剩下的时候就不再等待。同时,如果你给定的时间为负数,则页面可以无限制的加载,也就不限制其加载时间。注意这里说的加载页面并不单单使用driver.get()方法加载的页面。

//范例1:访问github主页,设置等待页面加载时间为1秒,预计报错
package seleniumdemo;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class demo1 {

public static void main(String[] args) throws InterruptedException{
WebDriver driver =new FirefoxDriver();
//等待页面加载1秒
driver.manage().timeouts().pageLoadTimeout(1, TimeUnit.SECONDS);
//访问github主页
driver.get("https://www.baidu.com/link?url=oPMUaexdxoOE78PXDKyjGjLVX09P8cN7jcykvwS3fZq&wd=&eqid=e8d1d2390003a3f30000000557fcd4e4");
driver.quit();
}

}
//运行结果
Exception in thread "main" org.openqa.selenium.TimeoutException: Timed out waiting for page load.
......
......
//范例2:将上面的代码修改为:设置等待时间为20秒,成功运行
driver.manage().timeouts().pageLoadTimeout(20, TimeUnit.SECONDS);

模拟键盘操作

selenium提供了Action API,它可以模拟键盘和鼠标的一些操作,比如点击鼠标右键,左键,移动鼠标等操作,对于这些操作,使用perform()方法执行。
思路:将当前的driver传入Actions对象中创建actions对象。然后利用actions对象的method模拟鼠标键盘

package seleniumdemo;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.interactions.Actions;

public class demo1 {
public static void main(String[] args) throws InterruptedException{
System.setProperty("webdriver.chrome.bin", "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe");
System.setProperty("webdriver.chrome.driver", "D:\\FilesToDriver\\chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.get("http://www.baidu.com");
Actions actions = new Actions(driver);
actions.sendKeys(driver.findElement(By.id("kw")), "selenium").perform();
actions.click(driver.findElement(By.id("su"))).perform();
driver.quit();
}
}

当然Actions对象才不只这些方法,方法可多了咯,大家可以参考官方API文档说明哦