selenium源码解析(selenium获取页面源码)
今天给各位分享selenium源码解析的知识,其中也会对selenium获取页面源码进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、python selenium如何获取下一页的html网页源码
- 2、熟练掌握Selenium工具核心功能总纲(二)
- 3、selenium超全教程(4)-持续更新中
- 4、python下用selenium的webdriver包如何取得打开页面的html源代码?
- 5、使用python简单封装selenium常用函数
python selenium如何获取下一页的html网页源码
一开始,基本上很多人都是用selenium IDE录制脚本开始的,我也是!有一本书写得很不错:selenium初学者指南!So,从录制回放开始我的selenium,而在这个过程中,不断地去补充我的html css知识,熟悉selenium的api!
慢慢地,发现录制的脚本在回放的时候经常报错,通过检查发现,是定位上的错误,导致这种定位的错误的最大原因是系统前端采用了某种框架,如tigerUI,exj....所以HTML里面的标签很多都是动态的,比如id,class,name!这对selenium操作定位的元素而进行自动化来说是致命伤!
所以,开始自己写定位信息,这已经是必须的了!从而学习了xpth和css选择器,掌握了更加有效,快速和稳定地定位页面上的元素(定位的时候难免会碰到有iframe,这就得先切换到iframe中再进行定位了)!也就是,在selenium IDE上写脚本!
信心满满地在selenium IDE上写了长长地一段脚本,并且反复跑都能成功!总算尝到了一点点幸福的滋味!然后呢,问题来了,当我要修改和扩展这段的脚本的时候,才发现这效率是相当地低!一句句查!一句句改!多么痛的领悟!
另外,selenium IDE 默认启动的是火狐,在使用selenium RC 启动 IE 进行跑脚本时浏览器总是会报错!各种搞不定,各种不淡定!决定放弃使用IDE!
selenium有一个强大之处就是支持多种语方:java,C#,python等等,并且可以把录制的脚本转换成代码!我用的是java,果断走起!
不用说,当然是把脚本转为java代码了,在E clipse中重新开始搞!
选择一个测试框架:有Junit和TestNg两个选择,公司用的是junit,所以,不用多说,我就用junit验证selenium脚本的运行结果!并且,Junit和TestNG都可以生成比较直观的测试报告!
写好一些代码,会看到整段代码中密密麻麻充斥着基本相同的代码:开始封装代码!把常用到API封装起来!封装好之后代码看着就舒服多了!
接下来,是不是也应该把代码中的定位信息用一个专门的文件放起来,再去读取里面的定位信息,这样,维护代码和维护定位信息就放在了两个地方,不用老是扎在代码和定位路径中,简单地分一下层!果断尝试!
熟练掌握Selenium工具核心功能总纲(二)
举一反三:
那么下拉框如何定位页面元素呢?dom示例:
那么定位去操作它的方法,也应该同多选框操作一直:
@Test
void test_select() throws InterruptedException {
WebElement element = driver.findElement(By.id("fruitselect"));
Select select = new Select(element);
// 下面根据不同方法选择下拉框的值
Thread.sleep(2000);
select.selectByIndex(2);
Thread.sleep(2000);
select.selectByValue("orange");
Thread.sleep(2000);
select.selectByVisibleText(" 苹果 ");
// 遍历集合打印下拉框的所有值
List options = select.getOptions();
for (WebElement option : options) {
System.out.println("输出单选值:"+option.getText());
}
}
8、掌握alert、confirm、prompt三种弹框处理;这三种弹窗的处理方式不出意外都是Alert类来处理。
9、 selenium 三种等待方式的原理及使用场景:强制等待、隐式等待、显示等待;时间同步机制。
10、selenium等待条件,isEnabled()isSelected()源码分析:
比如在某些场景中,需要等待元素出现后才能操作它,这时需要的是等待,至于是哪种等待呢?需要结合实际场景来分析:
// 下面这个操作是先找元素,是否现实,这里有一个条件即使是隐藏元素,它还是存在dom中,而有些隐藏是不一定会存在dom,那么查找元素是会报异常:NoSuchElementException
@Test
public void test_display() throws InterruptedException {
WebElement el = driver.findElement(By.id("displayed-text"));
System.out.println("判断输入框是否显示:" + el.isDisplayed());
if (el.isDisplayed()) {
el.sendKeys("displayed");
System.out.println("点击隐藏按钮,元素被隐藏");
driver.findElement(By.id("hide-textbox")).click();
}
Thread.sleep(3000);
WebElement ele = driver.findElement(By.id("displayed-text"));
// 因为知道上面的操作是默认显示,并且输入值,if判断为true表示显示,然后输入文本内容并点击隐藏
if (!ele.isDisplayed()) {
// 如果是隐藏的,下面操作显示并输入内容
driver.findElement(By.id("show-textbox")).click();
System.out.println("点击显示按钮,元素被显示");
ele.sendKeys("+再次打开");
}
Thread.sleep(3000);
// 然后再次隐藏
driver.findElement(By.id("hide-textbox")).click();
}
tips:元素的操作,判断状态:isEnabled,判断显示:isDisplayed,判断是否可选:isSelected
11、鼠标操作:单击、双击、右击、键盘输入及组合键的应用;前提是前端开发支持按键操作。
在 web 自动化中,所有键盘操作不一定是支持的,需要前端开发支持。
import org.openqa.selenium.Keys;// 这个是selenium框架的关键类
// 发送单个按键操作,element的sendKeys()方法即可
findElement(By.id("kw")).sendKeys(Keys.ENTER);
// 如果是组合键,例如control+a
String select=Keys.chord(Keys.CONTROL,"a");
findElement(By.id("kw")).sendKeys(select);
// 使用Actions类处理按键操作
import org.openqa.selenium.interactions.Actions;
Actions action = new Actions(driver);
action.keyDown(Keys.CONTROL).sendKeys("a").keyUp(Keys.CONTROL).perform();
12、需要掌握执行JavaScript的方法和技巧,JavascriptExecutor类:
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.chrome.ChromeDriver;
System.setProperty("webdriver.chrome.driver","drivers/chromedriver.exe");
driver = new ChromeDriver();
// 下行强制转换
JavascriptExecutor js=(JavascriptExecutor) driver;
13、屏幕截图:实现截屏及日期格式保存图片
思考:会写在哪个位置?
通常使用TestNG/junit测试框架,会使用@After注解,也就是说在每个 测试 用例执行完才截图,而不是一个测试类执行完才截图,那么就需要对执行的结果进行断言,错误才截图,而不是随意截图。
优先封装一个生成文件名的方法:
/**
* 获取随机字符串作为文件名的长度
* @param length
* @return
*/
public static String getRandomString(int length) {
StringBuilder sb = new StringBuilder();
String characters = "1234567890qwertyuioplkjhgfdsazxcvbnmPOIUYTREWQASDFGHJKLMNBVCXZ";
for (int i = 0; i length; i++) {
int index = (int) (Math.random() * characters.length());
sb.append(index);
}
return sb.toString();
}
selenium超全教程(4)-持续更新中
单选比较好操作,先定位需要单选的某个元素,然后点击一下即可。
多选好像也比较容易,依次定位需要选择的元素,点击即可。
下拉框的操作相对复杂一些,需要用到Select模块。
先导入该类
在select模块中有以下定位方法
测试页面
然后,再演示下拉框的不同选择的方式
Selenium打开一个页面之后,默认是在父页面进行操作,此时如果这个页面还有子页面,想要获取子页面的节点元素信息则需要切换到子页面进行擦走,这时候switch_to.frame()就来了。如果想回到父页面,用switch_to.parent_frame()即可。
既然是模拟浏览器操作,自然也就需要能模拟鼠标的一些操作了,这里需要导入ActionChains 类。
左键
这个其实就是页面交互操作中的点击click()操作。
右键
context_click()
在上述操作中
双击
double_click()
drag_and_drop(source,target)拖拽操作嘛,开始位置和结束位置需要被指定,这个常用于滑块类验证码的操作之类。
selenium中的Keys()类提供了大部分的键盘操作方法,通过send_keys()方法来模拟键盘上的按键。
引入Keys类
常见的键盘操作
send_keys(Keys.BACK_SPACE):删除键(BackSpace)
send_keys(Keys.SPACE):空格键(Space)
send_keys(Keys.TAB):制表键(TAB)
send_keys(Keys.ESCAPE):回退键(ESCAPE)
send_keys(Keys.ENTER):回车键(ENTER)
send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)
send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)
send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)
send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)
send_keys(Keys.F1):键盘F1
send_keys(Keys.F12):键盘F12
实例操作演示:
定位需要操作的元素,然后操作即可!
如果遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候尝试在get方法执行完成时获取网页源代码可能并非浏览器完全加载完成的页面。所以,这种情况下需要设置延时等待一定时间,确保全部节点都加载出来。
等待有三种方式:强制等待、隐式等待和显式等待
1.强制等待
直接time.sleep(n)强制等待n秒,在执行get方法之后执行。
2.隐式等待
implicitly_wait()设置等待时间,如果到时间有元素节点没有加载出来,就会抛出异常。
3. 显式等待
设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,如果成立那么程序就继续执行,否则就抛出一个超时异常。
WebDriverWait的参数说明:
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver: 浏览器驱动
timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
poll_frequency: 每次检测的间隔时间,默认是0.5秒
ignored_exceptions:超时后的异常信息,默认情况下抛出NoSuchElementException异常
until(method,message='')
method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
message: 如果超时,抛出TimeoutException,将message传入异常
until_not(method,message='')
until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。
其他等待条件
还有一些操作,比如下拉进度条,模拟javaScript,使用execute_script方法来实现。
在selenium使用过程中,还可以很方便对Cookie进行获取、添加与删除等操作。
输出:
python下用selenium的webdriver包如何取得打开页面的html源代码?
这个可以通过浏览器自带的f12 。
或者通过鼠标右键,审计元素获得当前html源代码。
步骤如下:
使用框架载入形式,代码如下:
代码解析:
src="123.htm" 载入的页面 。
scrolling=no 有3个选择 分别为yes no auto 这个就是设置下拉条的,yes为有下拉条,no
为没有,auto为自动识别。
width=500 载入页面的宽度 。
height=500 载入页面的高度 。
bordercolor="#000000" 载入页面的背景颜色 。
提示:只要复制我那句代码,然后再把宽度和高度设置成你想要的。
使用python简单封装selenium常用函数
年前走查脚本代码时,发现大家对selenium功能都在重复造轮子,而且容易出现一些常见低级bug。于是在闲暇之余,封装一些常用的selenium功能。
在某些网页中,存在多个frame嵌套。而selenium提供的find_element函数只能在当前frame中查找,不能切换到其他frame中,需要从最上级frame中逐步切换(当然也可以指定xpath的绝对路径,但是一般没人这么做)。在我们写代码过程中,需要明确知道当前frame位置和需要寻找元素的frame位置。在frame切换过程中,容易因为疏忽导致frame切换错误导致元素无法找到的bug。
页面中分布的frame,可以理解为树状结构。因此我们可以采用递归的方式, 沿着某条搜索路线frame节点,依次对树中每个节点均做一次访问。
我们以163网址上的登录框为例:点击登录按钮,弹出登录iframe页面。输入框位置在iframe中,因此我们不能使用xpath获取元素位置,需要进入iframe中,然后获取元素。
手动切换ifame可能会产生bug,因此需要一套自动切换和检索frame的机制。具体代码如下:
需要注意的是:如果页面中多个frame中,存在相同的xpath元素。还是需要指定frame的路径,否则会返回搜索到的第一个元素。
强制等待
直接调用系统time.sleep函数,不管页面加载情况一定会等待指定的时间, 即使元素已被加载 。
1.如果设置的时间较长,会浪费时间
2.如果设置的时间较短,元素可能没有加载。
页面中某元素如果未能立即加载,隐式等待告诉WebDriver需等待一定的时间,然后去查找元素。默认不等待,隐式等待作用于整个WebDriver周期,只需设置一次即可。
1.在上文的find_element函数中,采用递归方式在所有frame寻找元素。若采用隐式等待,则在每个frame中都需要等待设定的时间,耗时非常长。
2.某些页面我们想要的元素已经加载完毕,但是部分其他资源未加载。隐式等待必须等待所有元素加载完毕,增加额外等待时间。
显示等待一般作用于某一个元素,在设定的时间范围内,默认每间隔0.5秒查找元素。返回被加载的元素,若超过设定的时间范围未能查找则报错。显示等待作为selenium常用的等待机制,我们来看下他的源码和机制。
driver 注释中解释为WebDriver实例,但是代码中并未有相关检测,因此可以传入任何对象
但是__repr__函数中使用到session_id属性,如果需要显示属性或者转为str对象,最好在driver对象中添加session_id属性
在until函数中,我们可以看到driver对象传入method函数。在计时结束前,在不断循环执行method函数,如果method函数有正常返回值则退出循环,否则报TimeoutException错误。
可以采用装饰器对隐式等待进行封装,这样代码更加精简
同样的,采用装饰器对其他常用的函数进行封装,例如强制等待、点击、输入文本等。
装饰器虽然很方便,但也会产生一些麻烦。例如在find_element函数递归调用过程中,理应只要执行一次装饰器函数。但因为装饰器已经装饰完毕,导致每次递归都会执行。例如强制等待的sleep函数,如果递归次数越多等待时间越长。
解除装饰器一般有两种做法:一是约定参数,当递归第二次调用时则不生效。例如
这种方式实现简单,容易理解。但是增加了参数限制,在fun函数中就不能使用first_sleep参数。
二是采用装饰器采用wrapped实现,通过访问wrapped属性获得原始函数。例如
但是某一个函数被多个装饰器装饰时,需要递归解除装饰器。例如
最后整体代码如下
这次的封装其实还存在很多问题
1.find_element函数不仅仅只是提供查找元素功能,还提供一些其他功能,因此叫element_operation更为合适。
2.find_element函数的参数过多,并且很多参数的使用并不在函数本身中,对代码阅读很不友好。
3.得小心避免参数重复问题,假设装饰器sleep和装饰器wait_time都使用time这个参数,将无法区分具体是哪个函数使用。
4.不利于扩展和维护,当功能过多时find_element的参数过于庞大。
如果只是简单地封装和使用,上面这种方式也能达到较好的效果。如果想进一步封装,建议采用链式调用方式,装饰器辅助封装。例如
这样函数的扩展性和可阅读性有较大的提升
关于selenium源码解析和selenium获取页面源码的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。