Selenium是一款开源的Web自动化框架,模拟用户操作浏览器的行为,主要用于界面自动化、浏览器兼容性测试。
优点:
1、跨平台,如:Windows、Linux 和 Mac等;
2、支持各种浏览器,如:Chrome、Firefox、Edge、IE、Opear等;
3、完全开源。
webdriver:
将浏览器原生的API封装成WebDriver API ,作为编程语言与浏览器通信的桥梁,从而达到操作浏览器的目的。
注:不同的浏览器,需要不同的webdriver,且webdriver的版本号与浏览器版本号需对应。
导包:
from selenium import webdriver
本文以Chrome浏览器为例
driver = webdriver.Chrome(executable_path="driver路径")
将webdriver放置路径添加环境变量:
环境变量添加步骤:桌面—>我的电脑—>属性—>高级系统设置—>环境变量—>系统变量找到path并选中—>点击编辑—>新建—>保存,如下步骤:
推荐:一般直接将对应浏览器版本的driver文件放置在在python的安装目录下,省去再次添加环境变量(本人常用方法)。
设置环境变量后,可不用再次指定driver路径:
driver = webdriver.Chrome()
driver.get("http://xxxx")
driver.maximize_window() # 浏览器最大化
driver.minimize_window() # 浏览器最小化
driver.set_window_size(1980,1080) # 指定浏览器大小
options = webdriver.ChromeOptions()
options.add_argument('--headless') # 设置无界面
driver=webdriver.Chrome(chrome_options=options)
close():关闭当前当前浏览器窗口
quit():关闭所有页面,即关闭浏览器
6、其它操作
前进:driver.forward()
后退:driver.back()
刷新:driver.refresh()
driver.find_element_by_id()
driver.find_element_by_name()
driver.find_element_by_css_selector()
driver.find_element_by_tag_name()
driver.find_element_by_class_name()
driver.find_element_by_xpath()
driver.find_element_by_link_text()
driver.find_element_by_partial_link_text():模糊查询
注:查找多个元素:将上述定位方法中的element改为elements即可,如:driver.find_elements_by_name(),唯一属性id除外
**绝对路径:**以“/”表示,从HTML标签逐层向下寻找,如:/html/body/table/tbody/tr[2]/td[2]/div/div[2]/table[2]/thead/tr/th[1]
**相对路径:**以“//”表示,表示任意位置,依据给出的路径匹配节点
如://*[@id=“fileID”]
常用函数定位法:
使用contains方法,如:xpath=//input[contains(@id,‘abcd’)]
使用text()方法,如:xpath=//button[text()=‘保存’]
使用starts-with方法(同理还有:ends-with),多用于元素属性部分发生变化的情况,如:
# 如:id=abcd12312sdfsf342
xpath=//input[starts-with(@id,'abcd')]
一个元素需要通过多个属性值定位,可以用“and”,如:
//span[@id="fileID" and @class='classname']
常用的包含以下几种:
类选择:find_element_by_css_selector(".slg")
id选择:find_element_by_css_selector("#su")
标签选择:find_element_by_css_selector(“input”)
属性选择:find_element_by_css_selector("[name=‘kw’]")
层级关系:
find_element_by_css_selector(“span>input”)
find_element_by_css_selector(“form>input:nth-child(2)”) #查找form标签下第2个input元素
组合选择:find_element_by_css_selector(“form.fm>span>input.slg”)
其它方式:
find_element_by_css_selector("[class*=swait_lg]"),查找class属性包含“swait_lg”
find_element_by_css_selector("[class^=bba]"),以“bba”开头
find_element_by_css_selector("[class$=abb]"),以“abb”结尾
…
点击:click()
清除原有内容:clear()
输入值:send_keys()
获取内容:text
获取元素属性:get_attribute()
判断元素是否显示:is_displayed()
1、转移到弹窗:
ele = driver.switch_to.alert
ele.accept() # 接受
ele.text # 获取弹窗内容
ele.dismiss() # 退出或取消
2、页内焦点切换: driver.switch_to.frame(frame)
退出当前焦点窗口到原窗口:driver.switch_to.default_content()
3、多窗口切换:
driver.switch_to.window(name)
handles=driver.window_handles()
driver.switch_to.window(handles[-1])
selenium有3种等待方式:
1、强制等待
time.sleep(2)
2、显示等待(局部,针对某个元素)
WebdriverWait(driver,5,0.5).until(lambda driver:driver.find_element_by_xpath())
3、隐式等待(全局,可解决大部分的元素等待问题)
driver.implicitly_wait(20)
1.截取整个网页:
driver.get_screenshot_as_base64() # 保存的是base64的编码格式
driver.save_screenshot('XX/XX.png') # 如果在alert之类的弹出对话框出现后截图,程序会抛出异常
driver.get_screenshot_as_png() # 保存的是二进制数据,需要写成图片文件保存
driver.get_screenshot_as_file('XX/XX.png') # 获取当前window的截图,截图成功返回True,出现IOError的时候返回False
2.截小图:
ele.screenshot()
ele = driver.find_element_by_id('msg')
ele.screenshot('./3.png')
常用工具:Actionchains、pymouse、pykeyboard、pyautogui
1.Actionchains常用鼠标操作:
单机:click()
双击:double_click()
移动到某个元素上:move_to_element
在某个元素上悬停:click_and_hold
将一个元素拖到另一个元素上:drag_and_drop
用法:
from selenium.webdriver.common.action_chains import ActionChains
ActionChains(driver).context_click(driver.find_element_by_id('su')).perform()
注:鼠标的所有事件,必须使用perform()执行所有ActionChains中存储的行为
2.键盘操作:
from selenium.webdriver.common.keys import Keys
send_keys(Keys.ENTER) # 键盘的回车事件
send_keys(Keys.BACKSPACE) # 删除,回退
# 组合使用
send_keys(Keys.CONTROL,'a') # 全选
send_keys(Keys.CONTROL,'c') # 复制
用法:driver.execute_script(js代码)
修改只读属性,如:driver.execute_script('document.getElementById(\'su\').readOnly=0;')
移动到页面底部
driver.excute_script("window.scrollTo(0,document.body.scrollHeight)")
注:本文是本人工作中学习及使用到的selenium常用方法,如有错误之处欢迎指出