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选择日期

 

posted @ 2021-04-27 15:06  meiyouyou  阅读(243)  评论(0编辑  收藏  举报