基于selenium的自动化测试脚本编写-python

浏览器操作
    1 启动浏览器并打开网页
    2 拖拽操作
    3 弹窗处理
    4 后退前进关闭
    5 cookies操作
异常处理
    1 等待
        11 sleep函数
        12 隐示例等待
        13 使用javascript
        14 显示等待
    2 异常处理举例
        21 点击页面元素
        22 填写表单
        23 等待窗口消失
页面元素操作
    1 定位页面元素
        11 id namexpath定位
        12 定位超链接
        13 tag name
        14 class name定位
        15 CSS Selectors
    2 点击页面元素
    3 填写表单
    4 获取页面文本
    5 滚动条
    6 当前屏幕截图
    7 模拟鼠标键盘事件
    8 表格处理删除修改添加等
常用网址

基于selenium的自动化测试脚本编写

1 浏览器操作
1.1 启动浏览器并打开网页

from selenium import webdriver

driver = webdriver.Chrome() #打开浏览器
driver.get(“http://www.baidu.com”) #访问url
driver.maximize_window() #最大化窗口

1
2
3
4
5

**ps.**webdriver会自动等待直到页面加载完成,但是如果页面采用了AJAX来更新的话,webdriver不能准确的判断加载完成的时间,这就会导致异常。

如果需要等待页面完全加载完成,请参考后续2.1 等待章节
1.2 拖拽操作

这里指将一个页面元素移动到指定位置

element = driver.find_element_by_name(“source”)
target = driver.find_element_by_name(“target”)

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

1
2
3
4
5
6

1.3 弹窗处理

alert = driver.switch_to_alert()

1

返回当前打开的alert对象,确定,取消或者读取这个对象的操作等同于直接操作弹窗。
1.4 后退前进关闭

driver.forward()
driver.back()
driver.close()
driver.refresh()

1
2
3
4

1.5 cookies操作

driver.get(“http://www.example.com”)

#添加cookies
cookie = {‘name’ : ‘foo’, ‘value’ : ‘bar’}
driver.add_cookie(cookie)

#获取cookies
driver.get_cookies()

1
2
3
4
5
6
7
8

2 异常处理

很多时候页面加载的速度是赶不上我们代码的运行速度的,这就导致一个问题,在我们操作一个元素的时候可能该元素并没有加载出来。这样就会返回异常,严重影响代码的健壮性。
2.1 等待

等待可以通过四种方式实现,通过等待并配合python的异常处理,可以保证代码的健壮性。
2.1.1 sleep函数

调用Thread.sleep(),预估需要等待的时间。这是最简单的方式,但是灵活性并不好。
时间单位是秒

import time
time.sleep(7)

1
2

2.1.2 隐示例等待

隐示等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,
告诉WebDriver查询Dom一定时间。默认值是0,但是设置之后,这个时间将在WebDriver对象实例整个生命周期都起作用。
(这是一段java代码的demo)

WebDriver dr = new FirefoxDriver();
dr.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

1
2

2.1.3 使用javascript

WebElement element = driver.findElement(By.xpath(test));
((JavascriptExecutor)driver).executeScript(“arguments[0].style.border=“5px solid yellow””,element);

1
2

2.1.4 显示等待

显示等待,就是在超时时间内,每隔10ms去查询一次元素是否可以进行设定的操作。

只有满足显式等待的条件满足,测试代码才会继续向后执行后续的测试逻辑
如果超过设定的最大显式等待时间阈值,这测试程序会抛出异常。

显式等待可以自定义等待的条件,用于更加复杂的页面等待条件

WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath)))

1

2.2 异常处理举例

异常处理就是首先判断要操作的元素时候出现了,然后再进行操作。

下面列举了几个常用页面操作的异常处理:点击页面元素,填表单,等待页面出现(主要用于有弹窗的情况)
2.2.1 点击页面元素

点击页面元素

def waitandClick(xpath):
try:
WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))) #等待页面能够点击
except TimeoutException as e:
#出现异常时候记录
print(‘Error:waitandClick, TimeoutException, xpath = %s\n’ % xpath)
log.writewebErrToLog(‘TimeoutException’, xpath)
else:
driver.find_element_by_xpath(xpath).click()

1
2
3
4
5
6
7
8
9
10

2.2.2 填写表单

ps.填写表单的时候由于不能确定原来的输入框中时候有文字,所以填写之前要先清楚原来的值(调用clear()函数)

填写表单

def waitandSendkeys(xpath, keys):
try:
WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, xpath)))
except TimeoutException as e:
print(‘Error:waitandSendkeys, TimeoutException, xpath = %s\n’ % xpath)
log.writewebErrToLog(‘TimeoutException’, xpath)
else:
driver.find_element_by_xpath(xpath).clear()
driver.find_element_by_xpath(xpath).send_keys(keys)

1
2
3
4
5
6
7
8
9
10

2.2.3 等待窗口消失

def waitforDisappear(xpath):
try:
process = driver.find_element_by_xpath(xpath)
WebDriverWait(driver, 20).until_not(lambda driver: process.is_displayed())
except NoSuchElementException as e:
print(‘Error:waitforDisappear, NoSuchElementException, xpath = %s\n’ % xpath)
log.writewebErrToLog(‘NoSuchElementException’, xpath)
return False

1
2
3
4
5
6
7
8

3 页面元素操作

ps.页面上不可见的元素是不能操作的比如,处于页面底端的元素,被弹窗遮盖的元素
3.1 定位页面元素

driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_xpath()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text()
driver.find_element_by_tag_name()
driver.find_element_by_class_name()
driver.find_element_by_css_selector()

1
2
3
4
5
6
7
8

找不到元素的时候会返回NoSuchElementException异常
3.1.1 id, name,xpath定位

1

定位元素方式

element = driver.find_element_by_id(“passwd-id”)
element = driver.find_element_by_name(“passwd”)
element = driver.find_element_by_xpath("//input[@id=‘passwd-id’]")

1
2
3

关于xpath语法请参考:http://www.w3school.com.cn/xpath/xpath_syntax.asp
3.1.2 定位超链接

Are you sure you want to do this?

Continue Cancel
1
2
3
4
5
6
7

定位方式:

continue_link = driver.find_element_by_link_text(‘Continue’)
continue_link = driver.find_element_by_partial_link_text(‘Conti’)

1
2

3.1.3 tag name

Welcome

Site content goes here.

1
2
3
4
5
6

定位方式:

heading1 = driver.find_element_by_tag_name(‘h1’)

1

3.1.4 class name定位

Site content goes here.

1
2
3
4
5

定位方式:

content = driver.find_element_by_class_name(‘content’)

1

3.1.5 CSS Selectors

Site content goes here.

1
2
3
4
5

定位方式:

content = driver.find_element_by_css_selector(‘p.content’)

1

CSS Selectors语法:http://saucelabs.com/resources/articles/selenium-tips-css-selectors
3.2 点击页面元素

driver.find_element_by_xpath(’/html/body/form/div/div[2]/button’).click()

1

3.3 填写表单

driver.find_element_by_xpath(’//[@id=“admin_pwd”]’).clear()
driver.find_element_by_xpath(’//
[@id=“admin_pwd”]’).send_keys(pwd)#input password

1
2

3.4 获取页面文本

driver.find_element_by_xpath(xpath).text

1

3.5 滚动条

参考文档:http://blog.varunin.com/2011/08/scrolling-on-pages-using-selenium.html

滚动到页面底部

driver.execute_script(“window.scrollTo(0, document.body.scrollHeight);”)

1

3.6 当前屏幕截图

from selenium import webdriver

driver = webdriver.Firefox()
driver.get(‘http://www.python.org/’)
driver.save_screenshot(‘screenshot.png’)
driver.quit()

1
2
3
4
5
6

3.7 模拟鼠标键盘事件

这是一个java实现的讲鼠标键盘的帖子:http://blog.csdn.net/lykangjia/article/details/46151611

from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

driver.find_element_by_xpath(’//*[@id=“list1”]/li[11]/a’).send_keys(Keys.DOWN)

1
2
3
4

3.8 表格处理(删除修改添加等)

讲解请参考:http://www.cnblogs.com/tobecrazy/p/4052069.html

核心就是通过base xpath(指这个table的第n行第m列相同的部分)来获取表格的值。

下面的例子实现了判断data是否在表格中,在就返回行号,否则返回0

#参数说明:
#baseXpath-指这个table的第n行第m列相同的部分
#tableXpath-要判断的表格的xpath
#arrData-需要判断的是否存在的某行数据
def getElementInTable(tableXpath, baseXpath, arrData):
table = driver.find_element_by_xpath(tableXpath)
#table的总行数,包含标题
table_rows = len(table.find_elements_by_tag_name(‘tr’))
#tabler的总列数
table_cols = len(arrData) - 1
flag = False
for row in range(2,table_rows + 1):
for col in xrange(1,table_cols + 1):
xpath = ‘%s/tr[%d]/td[%d]’ %(baseXpath, row, col)
if arrData[col] == driver.find_element_by_xpath(xpath).text:
if col == table_cols:
flag = True
else:
break
if flag == True:
return row
log.writeInfo(‘no such line:’)
for key in arrData:
log.writeInfo(’\t%s = %s\n’ % (key, data[key]))
return 0

作者:叶赫那拉肉肉
来源:CSDN
原文:https://blog.csdn.net/vivianliulu/article/details/74002246
版权声明:本文为博主原创文章,转载请附上博文链接!

你可能感兴趣的:(selenium)