1. 定位元素的几种方法
find_element_by_id(优先,常用),对应的是id属性
find_element_by_name(优先,常用),对应的是name属性
find_element_by_class_name,对应的是class属性的值
find_element_by_tag_name,对应的是标签名称,如input,p,span,title,body....
find_element_by_link_text,对应的是超链接的文本内容
find_element_by_partial_link_text,对应的是部分超链接的文本内容
find_element_by_xpath,对应的是元素的path,可通过firebug工具获得
find_element_by_css_selector,通过css属性定位,class用. id用#,
示例:
driver.find_element_by_css_selector(".s_ipt").send_keys("selenium")
driver.find_element_by_css_selector("#su").click()
2.By定位
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.LINK_TEXT,u"新闻")
find_element(By.PARTIAL_LINK_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")
3.几种浏览器操作
说明:操作浏览器需要将浏览器插件目录放入环境变量中,不然找不到
from selenium import webdriver
driver = webdriver.Ie() --IE浏览器,插件名为 IEDriverServer.exe
driver = webdriver.Firefox() -- 火狐浏览器,插件名为 geckodriver.exe
driver = webdriver.Chrome() -- 谷歌浏览器,插件名为 chromedriver.exe
driver = webdriver.Edge() --Edge浏览器(windows10系统自带), 无需插件
操作360浏览器:
360浏览器内核基于chrome浏览器,因此插件用的也是chromedriver.exe,不过得配置下
chrome_options = webdriver.ChromeOptions()
chrome_options.binary_location = r"C:\Users\kevin\AppData\Roaming\360se6\Application\360se.exe" #这里是360安全浏览器的路径
chrome_options.add_argument(r'--lang=zh-CN') # 这里添加一些启动的参数
d = webdriver.Chrome(chrome_options=chrome_options)
4.控制浏览器
设置宽高:driver.set_window_size(400,500), ------设置宽400,高500
设置全屏:driver.maximize_windows()
前进:driver.forward()
后退: driver.back()
刷新当前页面:driver.refresh()
5.定位到的元素操作
driver.find_element_by_xx('xx').click() --点击操作
driver.find_element_by_xx('xx').clear() --清除操作,清除文本框中的内容
driver.find_element_by_xx('xx').send_keys('123') --输入数据到文本框
driver.find_element_by_xx('xx').submit() --提交操作,相当于回车,如在搜索框中输入内容后,执行此方法,可直接执行搜索动作
driver.find_element_by_xx('xx').size() --获取元素的尺寸
driver.find_element_by_xx('xx').text --获取元素的文本
driver.find_element_by_xx('xx').get_attribute('id') --获取id属性,只要是属性都可通过此方法获取,如name,id,type,class.
driver.find_element_by_xx('xx').is_displayed() --获取元素是否可见,可见返回True,否则False
6.鼠标事件
Actions类中提供了鼠标操作的常用方法
perform() --执行所有Actions类中存储的行为
context_click() --右击
double_click() --双击
drap_and_drop() --拖动
move_to_element --悬停
调用示例:
context_click()
from selenium.webdriver.common.action_chains ActionChains driver = webdriver.Ie() right_click = driver.find_element_by_id() ActionChains(driver).context_click(right_click).perform()
其他的方法调用同上,只是改下方法而已
7.键盘操作
模拟组合键 CTRL+A,CTRL+C等等
from selenium.webdriver.common.keys import Keys
退格键 Keys.BACK_SPACE --- driver.find_elemennt_by_id('').send_keys(Keys.BACK_SPACE)
空格键Keys.SPACE --- driver.find_elemennt_by_id('').send_keys(Keys.SPACE)
输入CTRL+A --- driver.find_elemennt_by_id('').send_keys(Keys.CONTROL,'a')
回车键 --- driver.find_elemennt_by_id('').send_keys(Keys.ENTER)
8.设置元素等待
显式等待:
一直检测并等待某个元素出现或消失,达到最大时长条件还未成立则抛出超时异常
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Ie()
driver.get("https://www.baidu.com")
element = WebDriverWait(driver,5,0.5).until(
EC.presence_of_ element_located((By.id,"kw"))
)
element.send_keys('hello')
5:表示最长等待时间
0.5:检测间隔时间,也就是隔多长时间检测一次,单位秒
until:直到括号中条件成立,也存在until not
隐式等待:
driver.implicitly_wait(10),单位为秒,不设置默认为0,一般写在用例开头,针对整条用例有效,在定位一个元素时,如果元素未加载出来,则定位不到。此方 法会在设定时间内一直检测,检测到了就向下进行,否则就抛出超时异常
sleep休眠:
强制等待一段时间
import time
time.sleep(10)
9.定位一组元素
find_elements_by_xx,同定位单个元素一样,不过element是elements
示例:勾选全部checkbox
checkboxs = driver.find_elements_by_tag_name("input")
for checkbox in checkboxs:
if checkbox.get_attribute("type") == "checkbox":
checkbox.click()
10.操作下拉选择框
方法:
选择:
select_by_index() --通过索引
select_by_value() --通过value值
select_by_visiable_text() --通过显示的文本
反选:
deselect_by_index() --通过索引
deselect_by_value() --通过value值
deselect_by_visiable_text() --通过显示的文本
deselect_all() --取消选择所有
示例:
<select id="sid">
<option></option>
<option value="o1" id="id1">显示文本1</option>
<option value="o2" id="id2">显示文本2</option>
<option value="o3" id="id3">显示文本3</option>
</select>
选择示例:
select_by_index(1) --通过索引
select_by_value('o2' ) --通过value值
select_by_visiable_text('显示文本2') --通过显示的文本
完整示例:
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element_by_id("sid"))
select.select_by_index(1)
11. 多表单切换
许多页面存在表单嵌套情况,从一个表单是无法直接定位到其他表单中元素的,需要进行表单切换
f = driver.find_element_by_id("fr") --定位到id为fr的表单,定位方法通用
driver.switch_to.frame(f) ---切换到id为fr的表单中
操作完成后跳到最外层表单: driver.switch_to.default_content()
12.多窗口切换
获取当前窗口的handle: current_handle = driver.current_window_handle
获取所有窗口handle: handles = driver.window_handles
切换到其他窗口
for hand in handles:
if hand != current_handle:
driver.swith_to.window(hand) --切换窗口
13.弹窗处理
针对alert,prompt,confirm出现的弹窗,可使用driver.switch_to_alert()进行捕获并处理
方法:
text --返回弹窗的文本信息
accept(), --接受弹窗,也就是点击确定
dismiss() --取消弹窗
调用示例:
driver.switch_to_alert().accept() --点击确定
14.上传文件
方法一:直接通过send_keys()方法输入文件路径到文本框中,点击提交按钮
方法二:通过AutoIt工具,将操作过程打包成exe文件,然后通过python进行调用
15.操作cookie
获取所有cookie: driver.get_cookies()
获取名为xx的cookie: driver.get_cookie('xx')
添加cookie: driver.add_cookie(dict) -- 参数为字典对象
删除所有cookie: driver.delete_all_cookies()
16.调用JavaScript
js = "window.scrollTo(100,450);"
driver.execute_script(js)
17.处理HTM5视频播放
示例:
video = driver.find_element_by_xpath("body/Section[1]/div/video")
driver.execute_script("return arguments[0].play()",video) --播放
driver.execute_script("return arguments[0].pause()",video) --暂停
18.窗口截图
driver.get_screenshot_as_file("D:\xxx\xx.png")
19.关闭窗口
driver.close() ---关闭当前窗口
driver.quit() ---关闭所有窗口
20.验证码处理
1.去掉验证码
2.设置万能验证码
3.使用cookie
4.验证码识别
5.验证码存放在cookie中
21.操作已经打开的浏览器,下面以chrome为例
1.手动启动浏览器,以debug模式启动
C:\Program Files (x86)>chrome.exe --remote-debugging-port=9222
2.添加selenium配置
options = webdriver.ChromeOptions()
options.debugger_address(options)
driver = webdriver.Chrome(options)
剩下的按照之前正常操作就可以了
遇到的问题及解决方法:
1.报如下错误
selenium.common.exceptions.WebDriverException: Message: unknown error: call function result missing 'value'
(Session info: chrome=75.0.3770.142)
(Driver info: chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 10.0.17134 x86_64)
解决方案:
这是由于chromedriver和chrome浏览器版本不匹配导致的,匹配信息如下:
chromedriver版本 | 支持的Chrome版本 |
---|---|
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
v2.25 | v53-55 |
v2.24 | v52-54 |
v2.23 | v51-53 |
v2.22 | v49-52 |
v2.21 | v46-50 |
v2.20 | v43-48 |
v2.19 | v43-47 |
v2.18 | v43-46 |
v2.17 | v42-43 |
v2.13 | v42-45 |
v2.15 | v40-43 |
v2.14 | v39-42 |
v2.13 | v38-41 |
v2.12 | v36-40 |
v2.11 | v36-40 |
v2.10 | v33-36 |
v2.9 | v31-34 |
v2.8 | v30-33 |
v2.7 | v30-33 |
v2.6 | v29-32 |
v2.5 | v29-32 |
v2.4 | v29-32 |
下载地址:http://npm.taobao.org/mirrors/chromedriver/
http://chromedriver.storage.googleapis.com/index.html
如果chrome版本太高,建议使用IE浏览器代替
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。