
正文
Selenium系列之--04 常见元素操作总结
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
一、Selenium总共有八种定位方法 By.id() 通过id定位
By.name() 通过name 定位
By.xpath() 通过xpath定位
By.className() 通过className定位
By.cssSelector() 通过CSS 定位
By.linkText() 通过linkText
By.tagName() 通过tagName
By.partialLinkText() 通过匹到的部分linkText
By.id() 通过id定位
By.name() 通过name 定位
By.xpath() 通过xpath定位
By.className() 通过className定位
By.cssSelector() 通过CSS 定位
By.linkText() 通过linkText
By.tagName() 通过tagName
By.partialLinkText() 通过匹到的部分linkText
目前,使用比较多的是cssSelector和xpath,
cssSelector有一些高级用法,熟练后可以方便地定位元素,如^用于匹配一个前缀,$用于匹配一个后缀,*用于匹配任意字符。例如:
a. 匹配一个有id属性,并且id属性是以”id_prefix_”开头的超链接元素:a[id^='id_prefix_']
b. 匹配一个有id属性,并且id属性是以”_id_sufix”结尾的超链接元素:a[id$='_id_sufix']
c. 匹配一个有id属性,并且id属性中包含”id_pattern”字符的超链接元素:a[id*='id_pattern']
最后总结:1. 当页面元素有id属性时,最好尽量用id来定位。2. xpath很强悍,但定位性能不是很好,所以尽量少用。如果确实少数元素不好定位,可以选择xpath或cssSelector。3. 当要定位一组元素相同元素时,可以考虑用tagName(HTML 标记名称)或name。4. 当有链接需要定位时,可以考虑linkText或partialLinkText方式。
NoSuchElementFoundException
findElement()和findElements()方法在找不到相应的元素时,就会抛出NoSuchElementFoundException异常
二、常用浏览器操作// 1.浏览器中加载URL: get() --首先要启动浏览器
driver.get("https://www.baidu.com");
driver.navigate().to("http://www.baidu.com/");
//navigate方法会产生1个Navigator对象,其封装了与导航相关的一些方法,比如前进后退等
// 2.浏览器最大化: window().maximize()
driver.manage().window().maximize();
// 3.刷新:refresh()
driver.navigate().refresh();
// 4.截图:getScreenshotAs()
File screenfile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenfile,new File("D:/12306.png"));
// 5.获取当前页的URL:getCurrentUrl()
String url = driver.getCurrentUrl();
System.out.println(url);
// 6.获取当前页的title:getTitle()
String title = driver.getTitle();
System.out.println(title);
三、常见页面元素操作总结1. 文本框(input)
WebElement.sendKeys() //元素赋值
WebElement.clear() //清空
WebElement.getAttribute("value"); //获取元素的属性值(一组元素中非常实用)
WebElemetn.getText() //获取输入框文本内容
// 1.浏览器中加载URL: get() --首先要启动浏览器
driver.get("https://www.baidu.com");
driver.navigate().to("http://www.baidu.com/");
//navigate方法会产生1个Navigator对象,其封装了与导航相关的一些方法,比如前进后退等
// 2.浏览器最大化: window().maximize()
driver.manage().window().maximize();
// 3.刷新:refresh()
driver.navigate().refresh();
// 4.截图:getScreenshotAs()
File screenfile=((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(screenfile,new File("D:/12306.png"));
// 5.获取当前页的URL:getCurrentUrl()
String url = driver.getCurrentUrl();
System.out.println(url);
// 6.获取当前页的title:getTitle()
String title = driver.getTitle();
System.out.println(title);
1. 文本框(input)
WebElement.sendKeys() //元素赋值
WebElement.clear() //清空
WebElement.getAttribute("value"); //获取元素的属性值(一组元素中非常实用)
WebElemetn.getText() //获取输入框文本内容
注:对于通过input标签实现的上传功能,可以将其看作是一个输入框,即通过sendKeys()指定本地文件路径的方式实现文件上传
2. 单选按钮,多选按钮()
WebElement.click();
WebElement.isSelected(); //判断元素是否被选中
WebElement.isEnabled();
WebElement.isDisplayed(); //判断元素是否显示
3. 下拉选 select
WebElement.selectByIndex(int index) 通过index,从0开始
WebElement.selectByVisibleText(String text) 通过匹配到的可见字符,是显示在下拉框的值
WebElement.selectByValue(String value) 通过匹配到标签里的value
不选择对应的选择项:
select.deselectAll();
select.deselectByValue(“name”);
select.deselectByVisibleText(“姓名”);
或者获取选择项的值:
select.getAllSelectedOptions();
select.getFirstSelectedOption();
详见:参考链接
4. 提示框Alert
细分三种,Alert,prompt,confirm
driver.switchTo().alert(); 获取alertAlert(driver).accept() # 等同于点击“确认”或“OK”
Alert(driver).dismiss() # 等同于点击“取消”或“Cancel”
Alert(driver).authenticate(username,password) # 验证,针对需要身份验证的alert,目前还没有找到特别合适的示例页面
Alert(driver).send_keys(keysToSend) # 发送文本,对有提交需求的prompt框(上图3)
Alert(driver).text # 获取alert文本内容,对有信息显示的alert框
详见:参考链接
5. 超链接
超链接比较常见,一般都是标签a
WebElement.click();
如果是chrome浏览器打开超链接时,点超链接的同时按下Ctrl会打开新标签,按下shift会打开新窗口
6.表单
提交方法:submit解释:查找到表单(from)直接调用submit即可
实例:driver.find_element_by_id("form1").submit()
切换方法:driver.switchTo().frame(xf)
解释:在 Web 应用中经常会遇到 frame/iframe 表单嵌套页面的应用, WebDriver 只能在一个页面上对元素识别与 定位, 对于 frame/iframe 表单内嵌页面上的元素无法直接定位。 这时就需要切换
dr.switchTo().frame("framename or id");
//frame直接跟id和名称均可WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
driver.switchTo().frame(xf);
//-------跳出表单
driver.switchTo().defaultContent();
7. 窗口
获取窗口的方法:
1. driver.getWindowHandle(); 返回的是字符串,获取当前窗口的句柄
2. driver.getWindowHandles(); 返回的是 Set<String> ,获取所有窗口
窗口切换
driver.switchTo().window(window);
8. 浏览器的cookies
有时候我们需要验证浏览器中Cookie是否正确, 因为基于真实Cookie的测试是无法通过白盒测试和集成测试进行的。
getCookies() //获得所有 cookie 信息。
getCookieNamed(String name) //返回字典的key为“name”的Cookie信息。
addCookie(cookie dict) //添加Cookie。“cookie_dict”指字典对象,必须有 name和value值。
deleteCookieNamed(String name) //删除Cookie 信息。 “name”是要删除的 cookie的名称; “optionsString” 是该Cookie的选项,目前支持的选项包括“路径” , “域” 。
deleteAllCookies() //删除所有 cookie 信息。
9. 隐式等待
- implicitlyWait。识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElement异常。
- setScriptTimeout。异步脚本的超时时间。WebDriver可以异步执行脚本,这个是设置异步执行脚本脚本返回结果的超时时间。
- pageLoadTimeout。页面加载时的超时时间。因为WebDriver会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么WebDriver就会抛出异常。
//页面加载超时时间设置为 5s
driver.manage().timeouts().pageLoadTimeout(5, TimeUnit.SECONDS);
driver.get("https://www.baidu.com/");//定位对象时给 10s 的时间, 如果 10s 内还定位不到则抛出异常
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.findElement(By.id("kw")).sendKeys("selenium");//异步脚本的超时时间设置成 3s
driver.manage().timeouts().setScriptTimeout(3, TimeUnit.SECONDS);
10. 执行JavaScript代码
使用selenium做自动化测试,有时需要执行一些JavaScript代码。在selenium中有Javascript类可以执行。
import org.openqa.selenium.JavascriptExecutor;
其中有两个方法我们会经常遇到。
executeScript、executeAsyncScript
| method | 详情 |
|---|---|
| executeScript | 同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕; |
| executeAsyncScript | 异步方法,它不会阻塞主线程执行。 |
a. 初始化driver
通过向下转型 JavascriptExecutor jse = (JavascriptExecutor) driver; 将driver转为JavascriptExector对象
然后再调用executeScript()方法来执行JS
JavascriptExecutor jse = (JavascriptExecutor)driver;
b.直接传入Javascript代码
可以直接给jse传入javascript代码:
jse.executeScript("window.document.getElementById('username').click()";
c.传入WebElement执行JS
//执行点击事件
JavascriptExecutor jse = (JavascriptExecutor) driver;
WebElement element = driver.findElement(By.id("jingshou"));
jse.executeScript("arguments[0].click();", element); //元素赋值
jse.executeScript("arguments[0].value=\"北京\"", from_inpox);//设置元素属性--- 指定的DIV新增(修改)了 style {height: 1000px}的属性
WebElement div = driver.findElemnt(By.id("myDiv"));
jse.executeScript("arguments[0].setAttribute('style', arguments[1])", div, "height: 1000px");
d. 滚动到指定位置小技巧
如何滚动到定位的元素,使用java script
// scroll to mylink
JavascriptExecutor scroll = (JavascriptExecutor) driver;
scroll.executeScript("arguments[0].scrollIntoView();", myLink);// roll down and keep the element to the center of browser
JavascriptExecutor scroll = (JavascriptExecutor)driver;
scroll.executeScript("arguments[0].scrollIntoViewIfNeeded(true);", download);
<!-- window.scrollTo(左边距,上边距); -->
scroll.executeScript("window.scrollTo(100,450);");//x为水平移动的像素、y为垂直移动像素、location为元素位置
//操作滚动条
1. 垂直滚动
String scroll = "document.documentElement.scrollTop=" + "y";
JavascriptExecutor jse=(JavascriptExecutor) driver;
jse.executeScript(scroll);
2. 水平滚动
String scroll = "document.documentElement.scrollLeft=" + "x";
jse.executeScript(scroll);
3. 滚动条式
String scroll = "document.getElementById("location").scrollLeft=x";
jse.executeScript(scroll);
四、其他定位方式1. JS的5种定位方式
有时候会出现一些诡异的定位失效或者定位到了点击失效的问题,这个时候如果用js进行直接执行该事件,往往就可以解决那些诡异的事情~
id定位:document.getElementById()
name定位:document.getElementsByName()
tag定位:document.getElementsByTagName()
class定位:document.getElementsByClassName()
css定位:document.querySelectorAll()
其中只有id对象用的是Element返回是单个对象,其他都是Elements返回的是一个list,下面的栗子:
search_js = "document.getElementsByName('wd')[0].value='selenium';"
search_js2 = "document.querySelectorAll('.s_ipt')[0].value='selenium';"
button_js = "document.getElementById('su').click();"
button_js2 = "document.getElementsByClassName('s_btn')[0].click()"
driver.execute_script(search_js2)
driver.execute_script(button_js2)





