Selenium学习笔记3 -- 页面元素基本操作
前提:操作前要先进行该页面元素初始化,然后定位元素,后再操作元素
1. 基本常用操作
-- 获取元素文本 userInput.getText();
-- 清除文本 userInput.clear();
-- 获取属性 userInput.getAttribute("value");
-- 输入文本 userInput.sendKeys("1123");
-- 单击元素 userButton.click();
-- "回车"操作 userInput.submit();
-- 设置该元素是否用户可见 userInput.isDisplayed(); 返回结果为true 或 false
-- 获得当前页面的title driver.getTitle();
-- 获得当前页面的URL driver.getCurrentUrl();
-- 模拟键盘操作
userInput.sendKeys(Keys.BACK_SPACE);
sendKeys(Keys.CONTROL,'c') 复制(Ctrl+C)
userInput.sendKeys(Keys.ENTER);
-- 鼠标的操作方法
Actions action = new Actions(driver); 调用Actions()类,将浏览器驱动driver作为参数传入
action.clickAndHold(search_setting).perform(); 鼠标悬停提交 moveToElement(); 悬停
contextClick() 右击 doubleClick() 双击 dragAndDrop() 拖动 release() 释放鼠标 perform() 执行所有Actions中存储的行为
-- 浏览器操作
设置浏览器最大化 driver.manage().window().maximize();
设置浏览器宽高 driver.manage().window().setSize(new Dimension(480, 800));
执行浏览器前进 driver.navigate().forward();
执行浏览器后退 driver.navigate().back();
刷新页面 driver.navigate().refresh();
关闭当前窗口,退出浏览器 driver.close();
关闭所有窗口,退出浏览器 driver.quit();
2. 模态框(警告框 & 确认框 & 提示框)处理
模态框是模态对话框,指用户想要进行对话框以外的应用程序操作时,须先对该对话框进行响应,如单击【确定】/【返回】等关闭该对话框
WebDriver处理javascript生成的alert,confirm以及prompt,具体做法使用switch_to_alert()方法定位到alert/confirm/prompt,然后再使用具体方法操作
getText() 返回alert/confirm/prompt中的文字信息
accept() 接受现有的警告框
dismiss() 解散现有警告框
sendKeys() / keysToSend() 警告框中输入文本内容
driver.switchTo().alert().getText();
driver.switchTo().alert().accept();
driver.switchTo().alert().dismiss();
driver.switchTo().alert().sendKeys();
3. 文件上传
对于通过input标签实现的上传功能,可将其看作一个输入框,通过sendKeys()指定本地文件路径的方式实现文件上传
AutoIT结合Selenium Webdriver进行文件上传
4. WebDriver操作cookie方法
获取cookie信息
获取全部: driver.manage().getCookies() / 获取指定: getCookieNamed(String name) 获取key为"name"的cookie值
删除cookie信息
删除全部: driver.manage().deleteAllCookies(); / 删除指定:deleteCookieNamed(String name)
添加Cookie。“cookie_dict”指字典对象,必须有 name和value值 addCookie(cookie dict)
5. 获取窗口截图
WebDriver提供了截图函数getScreenshotAs()来截取当前窗口
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
try {
FileUtils.copyFile(srcFile,new File("C:\\SWDTOOLS\\screenshot111.png"));
} catch (IOException e) {
e.printStackTrace();
}
6. 调用JavaScript代码来控制浏览器的滚动条
WebDriver提供executeScript()方法来执行JavaScript代码
//设置浏览器窗口大小,目的是让窗口出现水平和垂直滚动条
driver.manage().window().setSize(new Dimension(700, 600));
driver.get("https://www.baidu.com");
((JavascriptExecutor)driver).executeScript("window.scrollTo(0,450);");
(import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Dimension; )
用于调整浏览器滚动条位置的JavaScript代码如下:
<!-- window.scrollTo(左边距,上边距); -->
window.scrollTo(0,450);
window.scrollTo()方法用于设置浏览器窗口滚动条的水平和垂直位置
7. 下拉框选择
-- 定位<Select>类型下拉框
注意:Select类用于定位select标签,selectByValue()方法符用于选取<option>标签的value值
WebElement webElement = driver.findElement(By.name("form:j_idt163"));
Select select = new Select(webElement);
select.select_by_index(1); # 通过index进行选择
select.select_by_value("中风险"); # 通过value进行选择
select.select_by_visible_text("低风险"); #通过选项文字进行选择
-- 定位非<select>标签的下拉菜单
定位非<select>标签的下拉菜单中的选项,先定位到下拉菜单,再对其中的选项进行定位
-- 输入检索式选择框
定位这种类型的选择框分三个步骤,先定位输入框输入关键字,然后定位检索出来的选择列表框,最后定位相应的值
8. 多窗口切换
WebDriver提供了switchTo().window()方法可以实现在不同的窗口之间切换
注意:先获取当前窗口的句柄,再切换到另外窗口的句柄,接下来才能在另外窗口进行操作
String search_handle = driver.getWindowHandle(); 获取当前窗口的句柄
Set<String> handles = driver.getWindowHandles(); 获取所有窗口的句柄
driver.switchTo().window(handle); 切换到相应的窗口
9. 多表单切换(frame处理)
Web 应用中经常会遇到页面元素定位不到问题,明明元素在那,就是定位不到,此时可考虑 frame嵌套页面的情况;此时须先定位到iframe页面(html页面),再通过driver.switchTo().frame()方法将当前定位的主体切换为 frame/iframe 页面中,再定位iframe里的元素;
frame标签有frameset、frame和iframe三种。frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe对selenium定位而言是一样的,selenium有一组方法对frame进行操作;
WebElement xf = driver.findElement(By.xpath("//*[@id='loginDiv']/iframe"));
driver.switchTo().frame(xf); //切到frame中
driver.switchTo().defaultContent(); //从frame中切回主文档
driver.switchTo().parentFrame(); //从子frame切回父frame,不用切回主文档再切进来,用于多级frame嵌套情况
网络慢的时候也定位不到元素
10. selenium不会触发移除光标,需要键盘或鼠标操作触发
11. selenium处理lazy load
-- 惰性加载(也叫按需加载/延迟加载):优先加载可视区域的内容,并延迟其余部分,其他部分等进入了可视区域再加载,而不是一次性加载整个网页并呈现给用户。
-- 惰性加载可以减少时间消耗和内存使用,是一种对在线内容的优化技术,不管是网站还是网页应用。
-- 用selenium处理lazy load,主要是利用滚动条的下拉,当滚动条拉动到指定元素的位置时,判断某元素是否出现在页面中,若无出现,等待至超时,若出现,返回相应html.
12. 元素三大等待
selenium中,定位元素需增加元素等待,增加脚本稳定性(元素定位失败很多是未加等待导致,从而导致运行失败)
-- 强制等待
即令当前线程进入阻塞状态,当达到 sleep() 函数规定的时间后,再由阻塞状态转为就绪状态,等待 CPU 调度。
python: time.sleep(secs); [ import time; ]
java: Thread.sleep(2000); 注意主函数需要加throws InterruptedException
-- 隐式等待
implicitly_wait 设置全局等待时间,只需要添加一次,添加在打开浏览器之前
driver.manage().timeouts().implicitlyWait(2, TimeUnit.SECONDS);
在定位元素时,对所有元素设置超时时间,若超时未找到对象则抛出NoSuchElement异常
-- 显示等待
针对某个元素进行等待,判断元素定位后是否可见。默认每隔一段时间检测一次元素是否存在,若超时仍检测不到则抛出异常
WebDriverWait wait = new WebDriverWait(driver,3,1); 每1s检测一次,最多检测3s
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("kw66")));
(方法一&主函数)
HelloSelenium m = PageFactory.initElements(driver, HelloSelenium.class);
WebDriverWait wait = new WebDriverWait(driver,3,1);
wait.until(ExpectedConditions.visibilityOf(m.userInput));
(方法二&主函数)
13. 无头浏览器模式
-- 定义: 执行脚本时,不打开浏览器,只执行代码
-- 设置:
//创建Chrome无头参数
ChromeOptions chromeOptions=new ChromeOptions();
chromeOptions.addArguments("-headless");
//创建Drive实例
driver = new ChromeDriver(chromeOptions);
14. 验证码处理
使用验证码可以有效果的防止采用机器猜测方法对口令的刺探,在一定程度上增加了安全性;
WebDriver中并没有提供相应的方法来处理验证码,验证码的常见处理方式有以下几种:
-- 去掉验证码
可让开发人员把验证码的相关代码注释掉
-- 设置万能码
只要用户输入该万能验证码,程序就认为验证通过
-- 记录cookie
通过向浏览器中添加cookie 可以绕过登录的验证码,如第一次登录某网站可以勾选“记住密码”的选项,当下次再访问该网站时自动就处于登录状态了。这样其实也绕过验证码问题。那么这个“记住密码”的功能其实就记在了浏览器的cookie 中。前面已经学了通过WebDriver 来操作浏览器的Cookie,可以通过add_cookie()方法将用户名密码写入浏览器cookie ,再次访问网站时服务器直接读取浏览器Cookie 登录。
#访问xx 网站
driver.get("http://www.xx.cn")
#将用户名密码写入浏览器cookie
driver.add_cookie({'name':'Login_UserNumber', 'value':'username'})
driver.add_cookie({'name':'Login_Passwd', 'value':'password'})
#再次访问xx 网站,将会自动登录
driver.get("http://www.xx.cn/")
-- 调用tesseract来实现图像的识别,得到验证码
15. 日期时间控件处理
https://blog.csdn.net/weixin_30451709/article/details/99507655
-- 一般的日期控件都是input标签下弹出来的,设置日期使用selenium中的sendKeys 方法就可以解决
-- 若遇到日期控件不允许输入(input标签都会有一个readonly属性,此时只能选择时间),可用两种方式解决:
(1)通过JS选择日期
(2)通过Iframe选择日期