Python+selenium自动化测试元素操作
#########################
需要掌握两类 1,元素的操作 2,浏览器的操作
###############################
元素的常用操作方法 1,clear() 清空 2,sendkeys() 输入值,需要有参数, 3,click() 点击
#############################
浏览器的常用操作
1,driver.maximize_window() 最大化窗口,一定要记住,
2,driver.set_window_size(100,100) 设置窗口大小
3,driver.set_window_position(100,200) 设置窗口位置,
4,back()
5,forward()
6,refresh()
7,close() 关闭单个窗口,
8,quit() 关闭所有的窗口,
#################################
学习webdriver的其他方法
1,获取元素的大小
2,获取元素的文本,这是非常重要的,往往是一个是否登陆成功的验证条件,
3,获取元素的属性值
4,判断元素是否为可见状态,
1,size 获取元素的大小,这是后面没有括号的,需要定位元素
2,text, 获取元素的文本,需要定位元素, 这是后面没有括号的,
3,title 获取页面的title 这就是预期的你进入页面的结果,不需要定位元素,没有括号,
4,current_url 获取当前的url,没有括号,
5,get_attribute('XXX') 获取属性的值,XXX要获取的属性, 比如获取一个超链接的url地址,href,
6,is_display() 判断元素是否可见,
7,is_enabled() 判断元素是否可用,比如一个按钮是否可以点击,或者你要点击同意之后才可用, 都是常用的场景,
##################################
webdriver的鼠标和键盘操作,这个了解,不常用,鼠标有一个常用的就是悬停,
1,context_click() 右击,但是你是不能选择弹出的菜单的,
2,double_click() 双击
3,drag_and_drop() 拖拽
4,move_to_element() 悬停
5,perform() 此方法用来执行上面的所有的方法
这是导入包,from selenium.webdriver.common.action_chains import ActionChains
实例化actionchains对象,action = ActionChains(driver)
调用右击方法,ac = action.context_click(element) 这个username是说在哪里进行右击,传递的是已经定位好的元素,element
执行 ac.perform()
可以写成一句:ActionChains(driver).context_click(element).perform()
悬停也是一样的,悬停之后会有效果,
######################################
鼠标拖拽需要单独说一下
1,首先要定义两个元素,source target
2,drag_and_drop(source,target) 这是传递两个地址,
3,drag_and_drop(source,500,0 ) 这是拖拽500个像素,
####################################
键盘操作,模拟键盘上面的组合操作,比如ctrl+c ctrl+v
导入包,from selenium.webdriver.common.keys import Keys
1,sendkeys(keys.BACK_SPACE) 删除键
2,sendkeys(keys.SPACE) 空格
3,sendkeys(keys.TAB)
4,sendkeys(keys.ESCAPE)
5,sendkeys(keys.ENTER)
6,sendkeys(keys.CONTROL,'a')
7,sendkeys(keys.CONTROL,'c')
#######################################
元素等待: 1,元素等待,这是非常重要的, 如果在加载是操作不到的,所以要等待加载完,然后才做, 这种有显示等待,隐式等待
2,不设置等待会报出异常,因为找不到元素, 和网速有关系,
显式等待, 这种方法比较复杂,不常用,我们常用的是隐式等待,我们工作中也是使用隐式等待,
1,导包
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
2,ctrl+alt+空格,导入包
ctrl+p 提示参数
#######################################
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") element = (By.CSS_SELECTOR,'#kw') WebDriverWait(driver,10).until(EC.presence_of_element_located(element)).send_keys('admin') sleep(2) driver.quit() 可以分开写: driver = webdriver.Firefox() driver.get("https://www.baidu.com") element = (By.CSS_SELECTOR,'#kw') wait = WebDriverWait(driver,10) element = wait.until(EC.presence_of_element_located(element)) element.send_keys('admin') sleep(2) driver.quit()
如果找不到元素,会报出一个异常,
######################################
隐式等待 1,作用于全部的元素,显示等待是作用于一个元素的, # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") driver.implicitly_wait(10) # 这里设置10秒,工作中一般设置30秒, element = driver.find_elements_by_css_selector('#kw').send_keys('123') sleep(2) driver.quit() 所以我们在写的时候,打开页面, 先写最大化窗口 之后就是写隐式等待,
#################################
下拉框,警告框,滚动条的操作
掌握调用js的方法
###############################
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # select的操作 # 第一种方式 tag_name 定位 tags = driver.find_elements_by_tag_name('option') for tag in tags: if tag.get_attribute('value') == 'sh': tag.click() if tag.text =='重庆': tag.click() # 这种方式,不能切换,因为for循环是从上往下的, # 第二种方式 css 定位 driver.find_elements_by_css_selector('[value = "sh"]').click() driver.find_elements_by_css_selector('[value = "cq"]').click() driver.find_elements_by_css_selector('[value = "bj"]').click() # 这种方式如果有300个城市怎么办? # 第三种方法 select 这是专门用来select标签诞生的, # 有三种方法: # select_by_index() # select_by_value() # select_by_visible_value() # 记住这三种方法是直接就选中了,不需要再去点击了, from selenium.webdriver.support.select import Select selectEle = driver.find_elements_by_css_selector('select') select = Select(selectEle) select.select_by_index(1) select.select_by_index(2) select.select_by_index(3) select.select_by_value('sh') select.select_by_value('bj') select.select_by_visible_text('上海') sleep(2) driver.quit()
########################################
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # 警告框 # text 获取文本, 这是没有括号的, # accept() 确定 # dismiss() 取消 # 想要使用这三种方法,要先获取这个警告框, # alertEle = driver.find_elements_by_css_selector('#alert') # 定位警告框 alertEle.click() # 点击 alert = driver.switch_to.alert #切换到警告框上, # 然后就可以使用这三个方法了, text = alert.text # 需要一个变量接收 print(text) alert.accept() alert.dismiss() # 取消和确定,不能同时使用的, sleep(2) driver.quit()
#######################################
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from time import sleep # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # 滚动条的操作 # 提供了js脚本调用方法,所以可以js控制滚动条 # 最底层 # js1 = "window.scrollTo(0,1000)" # window是窗口句柄,scroll这是滚动条的意思,第一个0是距离最左侧0, 第二个是距离最顶部1000 # 最顶层 # js1 = "window.scrollTo(0,0)" # 执行 # driver.execute_script(js1) js1 = "window.scrollTo(0,1000)" driver.execute_script(js1) sleep(2) driver.quit()
########################################
frame表单的切换:
# 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # frame表单的切换: # 1,页面里面有套了页面,你需要切换进入frame才可以操作里面的元素, # 2,frame是引用了另一个页面, # 方法: # driver.switch_to.frame('frame_name') # 里面是frame的name # driver.switch_to.default_content() # 恢复到默认页面, driver.switch_to.frame('name') driver.switch_to.default_content() sleep(2) driver.quit()
###################################
窗口的切换和截图
# 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") # 截图保存,一般配合断言的使用 # 多窗口切换 # 提供了三种方法 # current = driver.current_window_handle # 获取当前窗口的句柄 # handle = driver.window_handles # 获取所有的窗口的句柄 # driver.switch_to.window(handle) # 切换到指定句柄 current = driver.current_window_handle driver.find_element_by_link_text('百度').click() for hanle in driver.window_handles: if hanle != current: driver.switch_to.window(hanle) # 下面就是操作 driver.find_elements_by_css_selector('#id').send_keys('123') # 截图 driver.get_screenshot_as_file('../img/123.png') # 括号里面是保存路径 sleep(2) driver.quit()
##################################
# 验证码 # 处理方法 # 测试环境,去掉验证码 # 生产环境,设置万能验证码, # 验证码识别技术,很难达到100%,验证码种类繁多啊, # 记录cookie,记录cookie进行登陆,推荐,这个方法主要进行讲解,
##################################
cookie
用户登陆之后,服务器一般都会设置cookie,保存在浏览器,
你再去请求的时候,服务器校验cookie,有的话就不需要在去登陆了,实现了长连接,否则每次都要登陆
所以你可以先登陆,然后使用自动化脚本的时候,把cookie带上, 然后服务器就不要让你再登陆了,所以你都成功登陆了,你就不需要考虑验证码了
这就是绕过了验证码
方法:
get_cookie(name) name是键名,获取指定的cookie
get_cookie() 获取本网站本地所有cookie
add_cookie(str) 添加cookie, str要是字典格式的, str = {"id":"userid","name":"usename"}
########################################
获取百度的所有的cookie
from selenium import webdriver from time import sleep import json # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") #程序打开网页后20秒内手动登陆账户 sleep(20) with open('cookies.txt','w') as cookief: #将cookies保存为json格式 cookief.write(json.dumps(driver.get_cookies())) sleep(2) driver.quit()
##########################################
把所有的cookie都设置到浏览器中,然后刷新页面就发现百度登陆了,
from selenium import webdriver from time import sleep import json # 实例化浏览器 driver = webdriver.Firefox() driver.get("https://www.baidu.com") #首先清除由于浏览器打开已有的cookies driver.delete_all_cookies() def getPureDomainCookies(cookies): domain2cookie={} #做一个域到cookie的映射 for cookie in cookies: domain=cookie['domain'] if domain in domain2cookie: domain2cookie[domain].append(cookie) else: domain2cookie[domain]=[] maxCnt=0 ansDomain='' for domain in domain2cookie.keys(): cnt=len(domain2cookie[domain]) if cnt > maxCnt: maxCnt=cnt ansDomain=domain ansCookies=domain2cookie[ansDomain] return ansCookies with open('cookies.txt','r') as cookief: #使用json读取cookies 注意读取的是文件 所以用load而不是loads cookieslist = json.load(cookief) cookieslist = getPureDomainCookies(cookieslist) # 方法1 将expiry类型变为int for cookie in cookieslist: #并不是所有cookie都含有expiry 所以要用dict的get方法来获取 if isinstance(cookie.get('expiry'), float): cookie['expiry'] = int(cookie['expiry']) driver.add_cookie(cookie) #方法2删除该字段 # for cookie in cookieslist: # #该字段有问题所以删除就可以 浏览器打开后记得刷新页面 有的网页注入cookie后仍需要刷新一下 # if 'expiry' in cookie: # del cookie['expiry'] # driver.add_cookie(cookie) driver.refresh() sleep(10) driver.quit()
##############################################
###################################