Linux运维进阶-Python,Docker,Shell

初学web自动化测试--笔记1

2020-08-28  本文已影响0人  My熊猫眼

web driver 是可以直接操作浏览器的driver, 根据不同的浏览器,需要不同的driver,下面列出了一些可用的web driver的镜像地址:
chrom浏览器的web driver(chromedriver.exe)http://npm.taobao.org/mirrors/chromedriver/
firefox(火狐浏览器)的web driver (geckodriver.exe)https://github.com/mozilla/geckodriver/releases
IE(IEDriverServer_Win32_3.9.0.zip 是32位的3.9.0 driver): http://selenium-release.storage.googleapis.com/index.html
web自动化测试中,可以通过webdriver的API,向浏览器发送相应的request, 然后实现自动测试,比如自动点击,自动填写,自动滚动,自动切换窗口/标签页等。 但是如上所述,不同的浏览器有不同的web driver. 那么自然也就有不同的API提供,所以对于同一个功能,那么就需要基于不同的driver,学习不同的API,这操作起来,岂不是头疼?
在python中,我们只需要按照如下导入webdriver, 就可以轻松用一种方式来应付各种不同的web driver了:

#!/usr/bin/evn python
from selenium import webdriver
driver_file=/The/Web/Drive/File/Path   #Change it to your web driver's path.
browser=webdriver.Ie(executable_path=driver_file)    #Assume this is IE browser.

如果web driver 已经放到了python的安装目录下(也就是和python.exe在一个目录下),那么可以无需提供webdriver.Ie的参数。上述代码获得的browser就可以看作是浏览器对象。
获得了浏览器对象,看起来我们就可以操作了,但是,通常在一个页面上有很多的元素,我们需要操作的对象是这些元素,那么怎么识别这些元素呢? 当然有很多的工具可以用,个人更倾向于用 firefox上的一款叫作selenium IDE 的插件, 使用方法很简单,这里就不做介绍了.

获得了浏览器对象,也可以找到需要的元素,那么我们介绍几个最常用且简单的操作方法吧:

browser.get
打开指定的网页,实现对这个浏览器对象的更新;对于IE浏览器有如下的注意项: A. 浏览器只能是100%大小,不能缩放; B. 浏览器的internet option, 其security 选项,要确保其四个zone都是 启用保护模式 或者关闭保护模式,个人倾向于关闭保护模式
browser.title:
在用get方法对浏览器对象更新之后,那么可以用 其titl 属性,获取浏览器当前打开页面的title, 还可以用 current_url 获取url地址,还可以用 fullscreen_window 方法最大化浏览器以及 quit 来退出等...
browser.find_element_by_id:
通过元素的id获取元素,也支持通过 css_selector, name, link_text, class_name...... 因为我们用selenium IDE 获得元素只是提供了我们查找元素的依据,所以在自动测试脚本中,我们依然要首先定位到元素,因此这里才有很多查找元素的方法, 返回的是一个 元素对象.
browser.execute_script:
在浏览器中,通常都有很多的js 代码在运行,在webdriver中也是支持 运行js 代码的,通过browser.execute_script 来实现运行js的代码,这里需要注意的是:
a. execute_script 方法,支持多个参数,其中第一个参数是要运行的js代码,后面可以有 很多个参数,那么在前面的代码中如何引用后面提供的参数呢? 用 arguments[0] 来表示第一个参数,依次 用 arguments[1] 表示第二个参数...
b. 如果需要返回js代码的执行结果,应该如何做呢? 在第一个参数里面,把执行的结果 赋值给变量,然后用return 语句返回这个变量就可以了.
c. 因为 第一个参数其实就是js 代码,所以只有代码是正确的,基本都能执行。包括 点击事件,赋值,取值,更改属性等...
下面是一个简单的例子:

#!/usr/bin/env python
from selenium import webdriver
driver= webdriver.Ie()
driver.get("https://www.baidu.com")
e = driver.find_element_by_id("kw")          #定位id为kw的元素,就是baidu的输入搜索框;
driver.execute_script("arguments[0].value='selenium'",e)  #执行js脚本语句,向输入框输入值 selenium 
get_input=driver.execute_script("var v=arguments[0].value;return v",e)  #执行js脚本语句,从输入框获取当前的值, 然后通过return 语句返回值到python
print(get_input)         #执行的输出结果为selenium.

获得元素对象之后,可以进行相应的操作:

get_attribute("value") :
获取元素的value属性的值,这类元素的典型是 输入框,当然其他元素可能也有value属性,我们也可以获取其他属性的值,只要传递正确的属性参数就可以了.
send_keys("THE INPUT VALUE"):
典型的“输入框”元素,一般是需要输入值的,用该元素的send_keys方法就可以了,但是需要声明的是:IE浏览器的输入框有时候获取的值并不是完全匹配该方法所传递的值,估计是驱动的问题,要解决此问题,可以用js 输入,也可以配合get_attribute("value") 做一个verify ,确保输入值的正确性,如果不正确就一直输入,直到正确为止.
click
该方法顾名思义,就是“点击” 方法,典型的是各种button 元素,基本都接受该方法. 在IE浏览器中,可能出现的情况是:向button元素发送的click 事件没有响应,那么在确保元素定位正确的情况下,可以用js 的方式进行点击,具体的方式是:找到元素对象element_obj,然后用 browser.execute_script("arguments[0].click()",element_obj) , 从而实现点击操作。当然了,也可以直接用js的方式定位到元素并点击

窗口切换:

我们经常遇到点击元素之后,在新的标签页打开了对应的内容,此时如果要在新的标签页继续进行操作,那么需要进行标签的切换, 但是在用selenium 的时候,可能遇到的情况是在 新的窗口中打开了点击的页面,而不是新的标签页,这时候就需要进行窗口的切换. 具体的思路是:
首先通过 driver.current_window_handle 获取当前激活的窗口,然后用 driver.window_handles获得所有打开的窗口,该方法返回的是一个列表,保存了所有打开的窗口。然后进行比较,如果和当前打开窗口的 句柄不同,那么就 用 driver.switch_to.window() 方法切换到新的窗口。

Document DOM:

除了上述的element dom, 每一个载入的html document 都是一个Document DOM, 对于这些document dom, 常用的部分属性如下,可以通过 driver.execute_driver("$js_script") 的方式进行调用。
document.title
document.URL
document.readyState
document.cookie
document.domain

等待页面加载完成:

在很多情况下,我们点击页面之后,需要等待页面加载完成才能继续,此时最简单粗暴的方式是加上sleep的时间,但是这个操作是非常不推荐的,毕竟不同页面加载时间不一样,设长了,浪费时间,设置短了,还没有加载完成,其实我们可以用 selenium模块中的WebDriverWait 方法,例子如下:

#!/usr/bin/env python
from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait
driver= webdriver.Ie()
driver.get("https://www.baidu.com")
e = driver.find_element_by_id("kw")
driver.execute_script("arguments[0].value='中美贸易战'",e)
btn=driver.find_element_by_id("su")
btn.click()      #发送点击事件
#等待点击后的页面完成加载,等待的条件是 untile 后面的 lambda 匿名函数。
WebDriverWait(driver,10,0.5).until(lambda driver:driver.find_element_by_link_text("中美贸易战_百度百科"))
#完成加载之后,返回document的页面标题,如果没有上面等待加载完成的语句,那么会直接返回 "www.baidu.com"的页面标题。
s=driver.execute_script("return document.title")  #利用document的title属性返回标题
print(s)

菜鸟一枚,欢迎留言讨论。

上一篇下一篇

猜你喜欢

热点阅读