Selenium
Selenium是一个用于web应用测试的工具,Selenium测试直接运行在浏览器中,模拟用户操作
安装:
pip install selenium(win)
配置:
将下载的ChromeDriver进行解压,将解压后的文件放入合适的位置(将解压的文件放入配置了环境变量的文件夹
Chrome有界面运行
from selenium import werdriver
import time
driver = wedriver.Chrome() ##创建Chrome对象
#操作
driver.get('https://www.baidu.com')
time.sleep(2)
driver.quit() ##关闭浏览器
chrome无界面运行
rom selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
chrome_opt = Options() # 创建参数设置对象.
chrome_opt.add_argument('--headless') # 无界面化.
chrome_opt.add_argument('--disable-gpu') # 配合上面的无界面化.
chrome_opt.add_argument('--window-size=1366,768') # 设置窗口大小, 窗口大小会有影响.
# 创建Chrome对象并传入设置信息.
driver = webdriver.Chrome(chrome_options=chrome_opt)
# 操作这个对象.
driver.get('https://www.baidu.com') # get方式访问百度.
time.sleep(2)
print(driver.page_source) # 打印加载的page code, 证明(prove) program is right.
driver.quit() # 使用完, 记得关闭浏览器, 不然chromedriver.exe进程为一直在内存中.
Selenium Driver操作
- get(url) :在当前浏览器会话中访问传入的url地址
- close():关闭浏览器当前窗口
- quit():退出webdriver并关闭所有窗口
- refresh():刷新当前页面
- title:获取当前页的标题
- page_source:获取当前页渲染后的源代码
- current_url:获取当前页面的url
- window_handles:获取当前会话中所有窗口的句柄
Driver查找单个元素
-
find_element_by_xpath():通过xpath查找
-
find_element_by_class_name():通过class属性查找
-
find_element_by_css_selector():通过css选择器查找
-
find_element_by_id():通过id查找
-
find_element_by_name():通过name属性进行查找
-
find_element_by_partial_link_text():通过链接文本的部分匹配查找
-
find_element_by_tag_name():通过标签名查找
查找返回的是一个webelement对象
查找多个元素:将其中的element加上一个s,则是对应的多个查找方法
Driver获取截屏
-
get_screenshot_as_base64():获取当前窗口的截图保存为一个base64编码的字符串
-
get_screenshot_as_file(filename):获取当前窗口的截图保存为一个png格式的图片,filename参数为图片的保存地址,最后应该以.png结尾
-
get_screenshot_as_png():获取当前窗口的截图保存为一个png格式的二进制字符串
Driver获取窗口信息
-
get_window_position(windowHandle='current') :获取当前窗口的x,y坐标
-
get_window_rect():获取当前窗口的x,y坐标和当前窗口的高度和宽度
-
get_window_size(windowHandle='current'):获取当前窗口的高度和宽度
Driver切换操作
- switch_to_frame(frame_reference):将焦点切换到指定的子框架中
- switch_to_window(window_name):切换窗口
Driver执行js代码
-
execute_async_script(script,*args):在当前的window/frame中异步执行js代码
-
script:是你要执行的js代码
-
*args:是你的js代码执行要传入的参数
number = 10
for line in range(10):
# 模拟滚轮操作
js_code = '''
window.scrollTo(0, %s)
''' % number
# execute_script: 该方法可以执行js代码
driver.execute_script(js_code)
time.sleep(0.5)
number += 500
- excute_script(script,*arges):在当前的window/frame中同步执行js代码
Selenium Webelement操作
-
clear() :清空对象中的内容
-
click():单击对象
-
get_attribute(name):优先返回完全匹配属性名的值,如果不存在则返回属性名中包含name的值
-
screenshot(filename):获取当前元素的截图,保存为png,最好用绝对路径
-
send_keys(value):给对象元素输入数据
-
submit():提交表单
webelement常用属性
-
text:获取当前元素的文本内容
-
tag_name:获取当前元素的标签名
-
size:获取当前元素的大小
-
screenshot_as_png:将当前元素截屏并保存为png格式的二进制数据
-
screenshot_as_base64:将当前元素截屏并保存为base64编码的字符串
-
rect:获取一个包含当前元素大小和位置的字典
-
parent:获取当前元素的父节点
-
location:当前元素的位置
-
id:当前元素的id值
Action-Chains方法
动作链:调用动作链类可以得到一个对象,对象中有方法可以帮你做,拖拽图片等操作
-
click:左键单击
-
context_click:右键单击
-
double_click:双击
-
click_and_hold:点击并抓起
-
drag_and_drop(source,target):在source元素上点击抓起,移动到target元素上松开放下
-
drag_and_drop_by_offset(source,xoffset,yoffset):在source元素上点击抓起,移动到相对source元素偏移xoffset和yoffset的坐标位置放下
-
send_keys(*keys_to_send):将键发送到当前聚焦的元素
-
send_keys_to_element(element.*keys_to_send):将键发送到指定的元素
-
reset_actions():清除已经存储的动作
driver = webdriver.Chrome() try: driver.get('http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable') driver.implicitly_wait(3) # 使用隐式等待 # 切换到 id为iframeResult 的 iframe标签页面中 driver.switch_to.frame('iframeResult') # 需要拖动图片块的 源位置 source = driver.find_element_by_id('draggable') print(source.location) # 根据id为droppable 属性查找目标快 标签对象 target = driver.find_element_by_id('droppable') # 滑块的距离 distance = target.location.get('x') - source.location.get('x') # 注意: 只要是 ActionChains(driver)调用的方法,都需要调用 perform方法来执行 # 先点击鼠标,按住拖拽的标签 ActionChains(driver).click_and_hold(source).perform() number = 0 while number < distance: # 循环滑动,每次滑动3 每次移动3格 ActionChains(driver).move_by_offset(xoffset=3,yoffset=0).perform() number += 3 # 移动完毕后,必须释放 ActionChains(driver).release().perform() time.sleep(100) finally: driver.close()
Selenium Wait
-
显示等待
from selenium import wdbdriver from selenium.wedbriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.wedbriver.support import expected_conditions as ES driver = webdriver.Chrome() driver.get(网址) try: element =WebDriverWait(driver,10).until( EC.presence_of_element_located((By.ID,"myDynamicElement"))) finally: driver.quit()
-
隐式等待:在webdriver中进行find_element这类查找操作时,如果找不到元素,则会默认的轮询等待一段时间
from selenium import wedbriver driver =webdriver.Chrome() driver.implicitly_wait(10) driver.get('网址')
Driver操作Cookie
add_cookie(cookie_dict):给当前会话添加一个cookie
cookie_dict:一个字典对象,必须要有"name"和value两个键,可选的键有:'path'、‘domain
、’secure‘、’expiry‘