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()

 

##############################################

 

###################################

posted @ 2020-03-19 22:41  技术改变命运Andy  阅读(331)  评论(0编辑  收藏  举报