处理常见的自动化场景

1、定位frame中的对象:

在web应用中经常会出现frame嵌套的应用,假设页面上有A,B两个frame,其中B在A内,那么定位B中的内容则需要先到A,再到B。switch_to_frame方法可以把当前定位的主题切换到frame里,在frame里实际是嵌套了另外一个页面,而webdriver每次只能在一个页面识别,所以需要用switch_to_frame方法去获取frame中嵌套的页面。

driver.switch_to.frame("frame1")#移动到id为frame1的frame上
driver.switch_to.default_content()#将识别的主体切换出frame
# switch_to.frame的参数必须是id或者是name,所以一个frame只要有id和name处理起来很容易。如果没有的话,两种解决思路:
# 1、让开发加上id或者name
# 2、使用xpath等方式定位然后实现跳转

2、alert/confirm/prompt处理: 

使用switchTo.alert()方法定位到当前的 alert/confirm/prompt,然后在调用Alert 的方法进行操作,Alert提供了以下几个方法:

text : 返回alert/confirm/prompt中的文字内容
accept : 点击确认按钮
dismiss : 点击取消按钮如果有取消按钮的话
sendKeys : 向prompt中输入文字

#alert对话框
driver.find_element(By.XPATH,'//input[@name="alterbutton"]').click()
alert=driver.switch_to.alert #切换到js弹窗
value=alert.text#取出alert的值
print(value)
alert.accept()#点击确定

 

#promptbutton对话框
driver.find_element(By.XPATH,'//input[@name="promptbutton"]').click()
driver.switch_to.alert.send_keys("百度一下")
driver.switch_to.alert.accept()

#confirm对话框
driver.find_element(By.XPATH,'//input[@name="confirmbutton"]').click()
driver.switch_to.alert.dismiss()#点击取消
value=driver.switch_to.alert.text
print(value)
driver.switch_to.alert.accept()

3、下拉框处理:

web页面上经常会有下拉框,对下拉框的处理比较简单,一般分为两种情况:
(1)下拉框通过元素定位识别

driver.find_element(By.XPATH,'//option[@value="orange"]').click()

(2)创建一个Select的对象,然后通过相应方法处理

from selenium.webdriver.support.select import Select
element
=driver.find_element(By.XPATH,'//select[@id="Selector"]') select_el=Select(element) select_el.select_by_value('grape')#value属性的值 time.sleep(1) select_el.select_by_visible_text("香蕉")#可见文本内容 time.sleep(1) select_el.select_by_index(1) #索引定位,索引从0开始

4、调用javascript

当webdriver遇到无法完成的操作时候,这个时候可以使用javascript来完成,webdriver提供了execute_script()接口来调用js代码。

执行js有两种场景:一种是在页面上直接执行js、另一种是在某个已经定位的元素上执行js

driver.execute_script('alert(“hello!!”); ') #弹出窗口
#加边框 用途:判断元素是否识别到
element=driver.find_element(By.XPATH,'//input[@name="attach[]"]')
js_str2='arguments[0].style.border="5px solid red"'
driver.execute_script(js_str2,element)
#浏览器滚动条滚动 js与浏览器兼容
#举例:浏览器上下滚动
js_str3='document.body.scrollTop=%d;'
for i in range(9):
    time.sleep(2)
    if i%2==0:
        driver.execute_script(js_str3%5000)
    else:
        driver.execute_script(js_str3%-5000)
#移除元素的value属性
element1=driver.find_element(By.XPATH,'//input[@id="showSelectResult"]')
js_str4='arguments[0].removeAttribute("value");'
driver.execute_script(js_str4,element1)
#设置元素的value属性
element2=driver.find_element(By.XPATH,'//input[@id="showSelectResult"]')
js_str5='arguments[0].setAttribute("value","resetvalue");'
driver.execute_script(js_str5,element2)
# 识别并获取对象属性
driver.get('http://www.baidu.com')
js_str6 = 'var user_input = document.getElementById("su").getAttribute("value");return user_input;'
value=driver.execute_script(js_str6)
print(value)

5、浏览器多窗口处理

我们在测试一个web应用的时候有时候会出现多个浏览器窗口的情况,webdriver提供了相应的解决方案,如下:

首先要获得每一个窗口的唯一标识符号(句柄),通过获得的句柄来区分不同的窗口,从而对不同窗口上的元素进行操作。

def switch_window_by_title(title):
    for handle in driver.window_handles:
        driver.switch_to.window(handle)
        if driver.title.__contains__(title):
            break

def switch_window_by_url(url):
    for handle in driver.window_handles:#获取所有窗口的句柄
        driver.switch_to.window(handle)#通过句柄跳转窗口
        if driver.title.__contains__(url):
            break

e=driver.find_element(By.XPATH,'//select[@id="jumpMenu"]')
select_e=Select(e)
select_e.select_by_visible_text('开封教育网')
# switch_window_by_title('开封教育网')
switch_window_by_url('http://jtj.kaifeng.gov.cn/')
driver.find_element(By.XPATH,'//a[text()="政务服务"]').click()

6、cookie 处理:

假如我们需要验证浏览器中是否存在cookie,因为基于真实的cookie是无法通过白盒和集成测试完成的,webdriver可以读取、添加和删除cookie信息

webdriver操作cookie的方法如下:
get_cookies() 获取所有cookie信息
get_cookie(name) 返回特定name有cookie信息
add_cookie(cookie_dict) 添加cookie,必须有name和value值
delete_cookie(name) 删除特定部分的cookie信息
delete_all_cookies() 删除所有cookie信息

 

原文地址:https://www.cnblogs.com/lvhuayan/p/14455974.html