selenium知识点
selenium截屏
-
全屏截屏:截屏的是可视区域
driver.save_screenshot('baidu1.png')
-
部分截屏:指定元素截屏
image=driver.find_element(By.XPATH,'//*[@id="app"]/div/div/div[2]/div[3]/div[2]/form/div[3]/div/div/div/div/img')
time.sleep(3)
# driver.save_screenshot('baidu1.png')
image.screenshot('b.png')
eg:识别验证码
第一步:将验证码进行截图
image=self.locator_element(LoginPage.pict)
time.sleep(1)
image.screenshot('a.png')
第二步:将验证码进行灰度化
yzm = cv2.imread('a.png')
yzm = np.min(yzm, axis=2).astype(np.uint8)
cv2.imwrite('a.png', yzm)
第三步:识别验证码(ddddocr技术)
file = 'a.png'
path = str(Path(file).absolute())
ocr = ddddocr.DdddOcr()
with open(path, 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)
eg:
import time
from pathlib import Path
import numpy as np
import cv2
import ddddocr
from selenium.webdriver.common.by import By
from base.base_page import BasePage
class LoginPage(BasePage):
def __init__(self,driver):
super(LoginPage, self).__init__(driver)
login_username = (By.XPATH, '//*[@placeholder="请输入用户名"]')
login_password = (By.XPATH, '//*[@placeholder="请输入密码"]')
pict=(By.XPATH,'//*[@id="app"]/div/div/div[2]/div[3]/div[2]/form/div[3]/div/div/div/div/img')
# 验证码框
input_pict=(By.XPATH,'//*[@placeholder="请输入验证码"]')
# 点击登录按钮
click_login=(By.XPATH,'//*[text()="登 录"]')
def login(self, username, password,):
self.set_key(LoginPage.login_username, username)
self.set_key(LoginPage.login_password, password)
# 识别验证码
# 第一步:对验证进行截图
image=self.locator_element(LoginPage.pict)
time.sleep(1)
image.screenshot('a.png')
# 第二步:将验证码进行灰度化
yzm = cv2.imread('a.png')
yzm = np.min(yzm, axis=2).astype(np.uint8)
cv2.imwrite('a.png', yzm)
# 第三步:识别验证码
file = 'a.png'
path = str(Path(file).absolute())
ocr = ddddocr.DdddOcr()
with open(path, 'rb') as f:
img_bytes = f.read()
res = ocr.classification(img_bytes)
print(res)
# 第四步:填入验证码
self.set_key(LoginPage.input_pict,res)
time.sleep(10)
# 点击登录按钮
self.click(LoginPage.click_login)
time.sleep(10)
selenium三种等待方式
注意:执行 sleep()后线程休眠,而另外两种线程不休眠
1.强制等待--sleep()
import time
time.sleep(1)
2.隐式等待--implicitly_wait(最大等待时长)
原理:隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。注意:在使用隐式等待的时候,实际上浏览器会在你自己设定的时间内不断的刷新页面去寻找我们需要的元素 他是全局等待。
缺点:隐式等待对于有些条件无法生效,比如url的改变,窗口的延迟新增,动态属性延迟加载……
implicitly_wait(10)//隐式等待10s,10s内查到定位,则继续,否则抛出异常
3.显示等待--WebDriverWait()
显示等待是Selenium客户可以使用的命令式过程语言。主要思想是最长等待n秒,n秒内每隔一段时间去检查需要定位的元素是否存在(默认检测频率为0.5s),若存在则提前结束等待。若超时未找到则报错。默认抛出异常为:NoSuchElementException。这种等待比隐性等待更智能了一些,无视整个页面的加载,只要需要的元素存在了,就结束等待。显示等待不仅针对元素定位有效,而且可以针对某种行为(url的改变,属性的延迟加载)看它是否具备了一定的特征,就开始有所动作了。
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
#driver:浏览器驱动
#timeout:最长等待时间,默认以秒为单位
#poll_frequency:监测的时间间隔,默认为0.5秒
#ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常
#WebDriverWait一般有until和until_not方法配合使用
until(method,message='')
# 调用该方法提供的驱动程序作为一个参数,直到返回值为True。
until_not(method,message = '')
# 调用该方法提供的驱动程序作为一个参数,直到返回值为False。
#expected_conditions类提供的预期条件判断的方法
title_is #判断当前页面的标题是否等于预期
title_contains #判断当前页面的标题是否包含预期字符串
presence_of_element_located #判断元素是否被加在DOM树里,并不代表该元素一定可见
visibility_of_element_located #判断元素是否可见(可见代表元素非隐藏,并且元素的宽和高都不等于0)
visibility_of # 与上一个方法作用相同,只是上一个方法参数为定位,该方法接收的参数为定位后的元素
presence_of_all_elements_located #判断是否至少有一个元素存在于DOM树中。例如,在个页面中有n个元素的class为"wp",那么只要有一个存在就返回true
text_to_be_present_in_clement #判断某个元素中的text是否包含了预期的字符串
text_to_be_present_in_element_value #判断某个元素的value属性是否包含了预期的字符串
frame_to_be_available_and_switch_to_it #判断该表单是否可以切换进去,如果可以,返回True并且switch进去,否则返回false
invisibility_of_element_located #判断某个元素是否不存在于DOM树或不可见
element_to_be_clickable #判断元素是否可见并且是可以点击的
staleness_of #等到一个元素从DOM树中移除
element_to_be_selecte #判断某个元素是被选中,一般用在下拉列表
element_sclection_state_to_be #判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be #与上一个方法作用相同,只是-上一个方法参数为定位后的元素,该方法要收的参数为定位
alert_is_presen #判断页面上是否存在alert
一般用时显示等待+隐式等待一起用:隐式等待作用于全局,确保每一个你查找的元素都能够有足够的load时长,以便找到它使脚本正常运行。显示等待作用于你当前使用函数查找的这个元素,确保它快速高效的找到,显示等待不会管其他你要查找的元素的。
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
self.driver.implicitly_wait(60)
WebDriverWait(self.driver,50,poll_frequency=0.5).until(EC.presence_of_element_located(self.click_project))
self.click(self.click_project)
模拟鼠标进行点击
模拟鼠标要用selenium的ActionChains类进行实现
1.ActionChains方法
perform(self)–执行鼠标操作方法
reset_actions()–清楚操作子令
click(on_element=None)–点击鼠标左键
click_and_hold(on_element=None):点击鼠标左键,不松开
context_click(on_element=None):点击鼠标右键
double_click(on_element=None):双击鼠标左键
drag_and_drop(source, target):拖拽到某个元素然后松开
drag_and_drop_by_offset(source, xoffset, yoffset) :拖拽到某个坐标然后松开
key_down(value, element=None):按下某个键盘上的
key_up(value, element=None) :松开某个
move_by_offset(xoffset, yoffset):鼠标从当前位置移动到某个坐标
move_to_element(to_element) :鼠标移动到某个元素
move_to_element_with_offset(to_element, xoffset, yoffset):移动到
距某个元素(左上角坐标)多少距离的位置
pause(seconds):暂停操作(秒)
release(on_element=None):在元素上释放按住的鼠标按钮
send_keys(*keys_to_send):发送某个键到当前焦点的元素
send_keys_to_element(element, *keys_to_send) :发送某个键到指定元素
2.ActionChains使用步骤
#1.实例化:actions = ActionChains(driver)标签:知识点,常用,driver,self,元素,selenium,element,div,click From: https://www.cnblogs.com/MaybeGut/p/17623372.html
#2.调用鼠标操作方法:actions.move_to_element(menu)
#3.执行鼠标操作方法:actions.perform()
def click_mouse(self,loc):
close = self.locator_element(loc)
actions = ActionChains(self.driver)
actions.move_to_element(close).click().perform()