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
目前,使用比较多的是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() //获取输入框文本内容
注:对于通过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(); 获取alert Alert(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)
2. 超神的jQuery定位
Selenium系列之--04 常见元素操作总结的更多相关文章
- Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)
一.写在前面 上篇文章介绍的是关于浏览器的常见操作,接下来,我们将继续分享关于元素的常见操作,建议收藏.转发! 二.元素的状态 在操作元素之前,我们需要了解元素的常见状态. 1.常见元素状态判断,傻傻 ...
- selenium测试(Java)--元素操作(五)
元素的操作有 1. 清除文本 2. 模拟按键输入 3. 单击元素 4. 返回元素尺寸 5. 获取文本 6. 获取属性值 7. 判断是否可见 8. 提交 下面通过操作新浪邮箱的注册界面的脚本来展示使用方 ...
- Selenium系列(五) - 键盘操作详细解读
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Selenium系列(21) - Cookie操作和源码解读
如果你还想从头学起Selenium,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1680176.html 其次,如果你不懂前端基础知识, ...
- Selenium with Python 004 - 页面元素操作
毫无疑问,首先需要导入webdriver from selenium import webdriver 清除文本 driver.find_element_by_id('kw').clear() 文本输 ...
- [python爬虫] Selenium常见元素定位方法和操作的学习介绍
这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操作介绍,希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~同时CSDN总是屏蔽这篇文章,再加上最近 ...
- Selenium 定位页面元素 以及总结页面常见的元素 以及总结用户常见的操作
1. Selenium常见的定位页面元素 2.页面常见的元素 3. 用户常见的操作 1. Selenium常见的定位页面元素 driver.findElement(By.id());driver.fi ...
- [python爬虫] Selenium常见元素定位方法和操作的学习介绍(转载)
转载地址:[python爬虫] Selenium常见元素定位方法和操作的学习介绍 一. 定位元素方法 官网地址:http://selenium-python.readthedocs.org/locat ...
- Selenium常见元素定位方法和操作的学习介绍
参考地址: https://www.cnblogs.com/eastmount/p/4810690.html 这篇文章主要Selenium+Python自动测试或爬虫中的常见定位方法.鼠标操作.键盘操 ...
随机推荐
- 普通用户切换到root用户
普通用户切换到root用户首先按组合键 CTRL+ALT+T 进入终端界面,一般终端界面默认为普通用户权限模式,如何从普通用户进入root用户首先重置root密码输入 sudo passwd root ...
- python+Eclipse+pydev环境搭建1
编辑器: Eclipse + pydev插件 1. Eclipse是写JAVA的IDE, 这样就可以通用了,学习代价小. 学会了Eclipse, 以后写Python或者JAVA 都可以. 2. Ec ...
- linux批量检测服务器能否ping通和硬盘容量状态并抛出报警的一个脚本-附详细解释
有一些linux基础,最近刚开始学shell,参考了阿良老师的一个监测服务器硬盘状态的脚本,自己进行了一些扩展,今天比较晚了,后边会把注释放上来,感觉脚本还很不完善,希望大家一起探讨一下,共同学习 2 ...
- dotTrace激活服务器
http://active.09l.me IntelliJ IDEA 7.0 或 更高DataGrip 1.0或更高ReSharper 3.1 或更高ReSharper Cpp 1.0 或更高dotT ...
- (8) tomcat中管理领域、角色及用户
srverlet Container或web应用程序本身都可以提供控制web应用程序资源的安全防护 前者称为容器管理的安全防护,或者称为应用程序管理安全防护 通过内嵌机制,tomcat提供一些安全防护 ...
- Linux用户和组的概念
目 录 第1章 用户和组存在的关系 1 1.1 我们现在所使用的操作系统都是多用户操作系统 1 1.2 id命令查看当前登陆的用户信息 1 1.3 用户UID的分类 1 1.4 ...
- 条款33:避免遮掩继承而来的名称(Avoiding hiding inherited names)
NOTE: 1.derived classes 内的名称会遮掩base classes内的名称.在public继承下从来没有人希望如此. 2.为了让被遮掩的名称再见天日,可使用using 声明方式或转 ...
- Mysql ICP(翻译)
英文版原文链接 https://mariadb.com/kb/en/library/index-condition-pushdown/ ICP 全称 Index Condition Pushdown. ...
- 2. TypeScript笔记
1. 安装node.js之后 需要测试npm命令 2.命令正常安装TypeScript 3.安装Egret egret 命令
- jsp从servlet中获取的值为空
System.out.println("进入servlet"); UserServiceImpl us=new UserServiceImpl(); List<User> ...