常见自动化场景处理

1.定位一组对象

 content = driver.find_elements_by_css_selector('div.con_content p')

    for con in content:

        print(con.text)

2.层级定位

driver.find_element_by_id('***').find_element_by_id('***') 

3.定位frame中的对象

driver.switch_to_frame('login_frame') #切换至iframe框架

driver.switch_to_default_content()#切换至原来的页面

4.alert/confirm/prompt处理

   *selenium提供一个alert(),用来统一处理三种弹窗

driver.switch_to_alert()    #切换至alert

driver.switch_to_default_content()  #切换至原来原面

driver.switch_to_alert().accept() #弹窗页面确认按钮点击

driver.switch_to_alert().dismiss()#弹窗页面取消按钮点击

driver.switch_to_alert().text #弹窗页面文本内容获取

driver.switch_to_alert().sendKeys():写入内容到prompt弹窗内的文本框中

 

5.下拉框处理

## 方法一:下拉框通过元素定位识别
driver.find_element(By.CSS_SELECTOR,'option[value="eryue"]').click()
time.sleep(3)
# 方法二:创建一个select的对象
s = driver.find_element_by_id('month') # 识别下拉菜单元素
se = Select(s)  # 定义下拉菜单操作对象
# 1、按索引位置
se.select_by_index(0)
# 2、按照value值
se.select_by_value('sanyue')
# 3、按照文本内容
se.select_by_visible_text('二月')

# 方法三:通过层级定位
driver.find_element_by_id('month').find_element_by_css_selector('option[value="eryue"]').click()

6.调用JavaScript

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://www.12306.cn')

# 第一种 直接执行js语句
# driver.execute_script('alert("hello world!!")')
# 第二种 另一种是在某个已经定位的元素上执行js
wl = driver.find_element_by_id('fromStationText')  # 先要定位到元素 定义成变量
driver.execute_script("arguments[0].style.border='5px solid red'", wl)

# 修改元素的属性值

Js = 'arguments[0].removeAttribute("readonly");' #移除元素的value属性
e = driver.find_element_by_id('train_date')
driver.execute_script(Js,e)

js_modify= "document.getElementById('train_date').value='P2'"
driver.execute_script(js_modify,e)


# 操作浏览器的滚动条
# driver.execute_script(“document.body.scrollTop=10000;”)# 这句话有些浏览器无法实现滚动
time.sleep(5)
# 在这之前最好将窗口最大化
driver.execute_script("document.documentElement.scrollTop=10000;")  # scrollTop = 值 足够大 就会滚动到浏览器的最低部
# 滚动到指定元素位置
driver.execute_script('''document.querySelector("[href='/ucenter/password']").scrollIntoView()''')

7.浏览器多窗口处理

    方法一:获取所有窗口返回列表,以索引获取

handles = driver.window_handles # 获取当前打开的所有窗口的句柄

driver.switch_to.window(handles[0]) #切换到百度首页(切换到第一个打开的页面)

方法二:处理两个窗口的切换

 

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://mail.126.com')
# 两个窗口的操作思路
# 获取当前页面的窗口句柄
handle = driver.current_window_handle # 返回值是一个字符串
print(handle)
# 再打开新的标签页
driver.find_element_by_link_text('企业邮箱').click()
# 再获取所有窗口的句柄
handles = driver.window_handles  # 返回值是一个列表
print('窗口的句柄',handles)
# 开始判断是否是新要打开的窗口,如果是就跳转driver
for h in handles: #
    if h !=handle:
        driver.switch_to.window(h)
# 在新的标签页面进行元素操作
driver.find_element_by_link_text('产品').click()
time.sleep(5)
driver.quit()

 

方法三:处理多个窗口打开时切换

  

from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get('http://mail.126.com')
# 获取首页句柄
home_handle = driver.current_window_handle
# 打开多个窗口
driver.find_element_by_link_text('企业邮箱').click()
time.sleep(1)
driver.find_element_by_link_text('VIP邮箱').click()
# 获取所有窗口的句柄
handles = driver.window_handles
# 进行判断,跳转driver
for h in handles:
    driver.switch_to.window(h)
    if '企业邮箱' in driver.title:
        break

    if 'vip' in driver.current_url:
        break
driver.find_element_by_link_text('产品').click()
time.sleep(5)
driver.quit()

 

8.验证码处理

   验证码的处理方式:  

    1、去掉验证码---只适用于测试环境

    2、设置万能码---只适用于测试环境

    3、验证码识别技术--识别率比较低--python中提供了方法去识别图片中的文字,因为验证码一般会做模糊处理  

    4、手动输入(设置等待,手动输入)

    5、使用cookie绕过验证码,只能绕过登陆---cookie有时效性 (见9.cookie处理)

9.cookie处理

    使用cookie绕过登录页面直接登录

    步骤:

   1.获取登录后的cookie信息

   2.删除所有cookie信息(driver.delete_all_cookies()

   3.将cookie信息使用driver.add_cookie()方法逐一添加

   4.刷新页面

添加cookie代码:

from time import sleep

from case.drivers_set import driver

driver.get('http://shop.aircheng.com/')
driver.maximize_window()
driver.delete_all_cookies()#把所有cookie全部删掉
cookies_info = {#name,value
    'iweb_last_login':'c0300d28fd4a418845VQdTUgQFVgkDVQIBAwkOVgYHBlZSCARVXQJVBlVQAgdQBQJUT1VXHQcJRgYADlYHCAAF',
    'iweb_user_pwd':'241ed37b7448aea5e9VgkEAVQCAwNUAQhWU1NRB1AAAQcIBlhXUV1YU1cMVFZQUglXV1MECw0IV1lTXVRbUgZUVwZRAlQAUFMCXV0GUg',
    'iweb_username':'da538fb4d7c35be078UVNRAgMFUVEHBltRUgBXVgJSV1AGBwFXA1YDAVoAD1YJWgdcX0hJ',
    'iweb_user_id':'d3560da07629066935CVIGAQRSB1UFAAEKXg0GCw0GVV1UDA0EBQEBXQsHUVVXDg',
    'PHPSESSID':'f1cci9rklj7j1v3jdghsc89sq3',
    'iweb_callback':'1a2cb3437751a57244VlYBAgdTBFQIAVoCVwADWQcFUlUKDVQMBAYKUlIDBAc',
    'iweb_head_ico':'dd7ed0b46fa7cb8effBFJWCQYHVgRSBwIGVgNWUldUUQRTAQNfBVEAUVZSBQU',
    '__cfduid':'d2407355743689c42c39d3b14889a8d7c1589769872'
}
#一个一个将cookie信息传入进去
for c,s in cookies_info.items():  # items() 方法以列表返回可遍历的(键, 值) 元组数组
    cookies_lists = {
    'domain':'shop.aircheng.com',
    'httpOnly': False,
    'secure': False,
    'name': c,
    'path': '/',
    'value':s
    }
    driver.add_cookie(cookies_lists)
driver.refresh()
sleep(2)
driver.quit()
原文地址:https://www.cnblogs.com/joy-field/p/12876679.html