chrome版本和chromedriver的对应关系

chromedriver版本 支持的Chrome版本
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

chromedriver的下载地址

http://chromedriver.storage.googleapis.com/index.html

http://npm.taobao.org/mirrors/chromedriver/

我们如果要使用selenium操作浏览器,则必须在本机要有对应的浏览器的驱动,我们这里就用Chrom浏览器就可以了

将下载好的chromdriver驱动放在python的安装目录就可以了,和python.exe放在一起,因为我们的python肯定已经设置了环境变量

首先需要驱动我们有为python设置环境变量

下面正式进入selenium的学习

1、先看下如何打开一个我们要测试的网页

首先需要设置一个浏览器的驱动,这个意思就是我们要用什么浏览器可以测试,这里我们选择chrom浏览

需要导入一个webdriver模块

from selenium import webdriver

  

设置驱动对象使用Chrome浏览器

driver = webdriver.Chrome()

 

通过上面的驱动打开一个网页,比如下面的例子,我们打开百度

driver.get("https://www.baidu.com/")

  

我们还可以打开一个html文件,用下面的方式打开,通过绝对路径打开一个html文件

import os
file = "file:///" + os.path.abspath("test.html") driver.get(file)

  

上面这个驱动有些方法也介绍一下

a、退出所有页面

driver.quit()

  

b、设置打开的浏览器的宽度和高度,单位是像素

driver.set_window_size(width=500,height=700)

  

c、获取打开的浏览器的宽度和高度,单位是像素

sz = driver.find_element_by_id("kw").size

  

d、退出单个页面

drive.close()

  

e、前进的效果

driver.forward()

  

f、后退的效果

driver.back()

  

h、设置以全屏的效果打开浏览器

driver.maximize_window()

  

i、获取html的title信息

dr = webdriver.Chrome()
dr.get("https://zhidao.baidu.com/question/2208138027722887508.html") # 获取页面的的titile信息
print(dr.title)

  

j、获取当前的html的url信息

dr.current_url

  

2、下面看下如何定位一个元素

通过id定位一个标签

driver.find_element_by_id()

 

eg:

# find_element_by_css_selector,通过id属性去查找标签
c = driver.find_element_by_css_selector("#kw").send_keys("csss")
time.sleep(3)
driver.quit()

  

通过name属性定位标签

driver.find_element_by_name()

  

通过class name属性定位标签

driver.find_element_by_class_name()

  

通过标签名称定位标签

driver.find_element_by_tag_name()

  

eg:

# find_elements_by_tag_name,通过标签名称查找标签
c = driver.find_elements_by_tag_name("p").send_keys("csss")
time.sleep(3)
driver.quit()

  

通过a标签的文本信息定位一个标签

driver.find_element_by_link_text()

eg:

c = driver.find_element_by_link_text("新闻")
print(c.text)
c.click()
time.sleep(2)

  

  

通过a标签的部分文本信息定位一个标签

driver.find_element_by_partial_link_text()

  

eg:

c = driver.find_element_by_partial_link_text("闻")
print(c.text)
c.click()

  

通过xpath定位一个标签,也就是通过这个标签的路径去定位标签

driver.find_element_by_xpath(

  

eg1:

# 可以利用标签中的任意属性
c = driver.find_element_by_xpath("//input[@id='kw']").send_keys("sb")
d = driver.find_element_by_xpath("//input[@id='su']").click()

  

eg2:

# find_element_by_xpath还可以利用标签多个属性,进行与判断
c = driver.find_element_by_xpath("//input[@id='kw' and @name='sb']").send_keys("sb")

  

eg3:

# find_element_by_xpath还可以利用父标签找子标签,也可以从爷标签往下找
c = driver.find_element_by_xpath("//input[@id='kw' and @name='sb']/input").send_keys("sb")

  

eg4:

# find_element_by_xpath还可以加索引
c = driver.find_element_by_xpath("//input[@id='kw' and @name='sb']/input[2]").send_keys("sb")

  

eg5:

# find_element_by_xpath如果是*号,则匹配所有的标签
c = driver.find_element_by_xpath("//*[@id='kw' and @name='sb']/input[2]").send_keys("sb")

  

eg6:

# find_element_by_xpath还可以通过绝对路径取查找标签
c = driver.find_element_by_xpath("//html/body/input[2]").send_keys("sb")

  

通过css selector去定位一个标签

driver.find_element_by_css_selector()

eg1:

# find_element_by_css_selector,查找class属性为s_ipt的标签
c = driver.find_element_by_css_selector(".s_ipt").send_keys("csss")
time.sleep(3)
driver.quit()

  

eg2:

# find_element_by_css_selector,查找div标签下的子标签div,这个找子标签,但是可以嵌套多层,且可以和id,class公用
c = driver.find_element_by_css_selector("p>div#kw").send_keys("csss")
time.sleep(3)
driver.quit()

  

eg3:

# find_element_by_css_selector,查找p标签的子标签div,且这个div要有一个max=10的属性
c = driver.find_element_by_css_selector("p>div[maxlength='10']").send_keys("csss")
time.sleep(3)
driver.quit()

  

 

关于定位单个标签,我们还有下面一种写法,需要导入一个By模块

from selenium.webdriver.common.by import By

  

下面的方法和上面的方法一一对应,仅仅只是写的方式不一样

driver.find_element(By.ID,"kw")

  

driver.find_element(By.CLASS_NAME,"kw")

  

driver.find_element(By.LINK_TEXT,"yyyy")

  

driver.find_element(By.NAME,"cccc")

  

driver.find_element(By.CSS_SELECTOR,"cccc")

  

driver.find_element(By.PARTIAL_LINK_TEXT,"yyyy")

  

driver.find_element(By.XPATH,"ccccc")

  

3、下面看下如何定位一组元素,唯一的区别就是elements是复数,而不是单数

driver.find_elements_by_id()

  

driver.find_elements_by_name()

  

driver.find_elements_by_class_name()

  

driver.find_elements_by_tag_name()

  

driver.find_elements_by_link_text()

  

driver.find_elements_by_partial_link_text()

  

driver.find_elements_by_xpath()

  

我们看一个例子,通过路径打开一个html文件,然后对input标签中type属性为checkbox的标签进行点击操作

import os
file = "file:///" + os.path.abspath("test.html") driver.get(file)
eles = driver.find_elements(By.TAG_NAME,"input")
for ele in eles:
if ele.get_attribute("type") == "checkbox":
ele.click()
time.sleep(2)

  

4、下面看下鼠标操作一个标签元素

a、定位到一个元素,然后获取这个元素的 某个属性,get_attribute方法

# 常用的方法是先定位到一组元素,然后在通过get_attribute获取其他属性来定位元素
c = driver.find_elements_by_tag_name("input")
for i in c:
print(i.get_attribute("type"))

  

b、获取指定标签的文本信息

tt = driver.find_element_by_id("cp").text

  

c、确定某个元素是否被显示出来

tt = driver.find_element_by_id("cp").is_displayed()

  

d、获取某个标签,然后往这个标签中输入内容

driver.find_element_by_id("kw").send_keys("hello selenium")

  

e、获取某个标签,然后清空标签中的文本内容

driver.find_element_by_id("kw").clear()

  

f、获取某个标签,触发单击的效果

driver.find_element_by_id("su").click()

  

g、获取某个标签,然后触发form提交的效果,click也可以达到一样的效果

driver.find_element_by_id("su").submit()

  

h、鼠标悬停效果,需要导入一个模块

from selenium.webdriver.common.action_chains import ActionChains

  

sz = dr.find_element_by_link_text("设置")
# move_to_element悬停到指定的标签,perform就是提交这个操作
ActionChains(dr).move_to_element(sz).perform()
time.sleep(2)

  

i、鼠标右键操作

youjian = dr.find_element_by_id("su")

ActionChains(dr).context_click(youjian).perform()
time.sleep(2)

  

j、鼠标双击操作

youjian = dr.find_element_by_id("su")
ActionChains(dr).double_click(youjian).perform()
dr.quit()

  

5、下面看下键盘事件

需要导入一个模块

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

  

a、键盘的删除键

dr.find_element_by_id("kw").send_keys(Keys.BACKSPACE)

  

b、键盘的空格键

dr.find_element_by_id("kw").send_keys(Keys.SPACE)

  

c、键盘的全选键

dr.find_element_by_id("kw").send_keys(Keys.CONTROL,"a")

  

d、键盘的剪切键

dr.find_element_by_id("kw").send_keys(Keys.CONTROL,"x")

  

e、键盘的粘贴键

dr.find_element_by_id("kw").send_keys(Keys.CONTROL,"v")

  

f、键盘的回车键

dr.find_element_by_id("kw").send_keys(Keys.ENTER)

  

6、标签的等待

a、先看下隐式的等待,为这个驱动设置一个全局的等待的事件,这样通过这个驱动打开的页面就会等待所有的标签10s,直到整个标签先出来

driver.implicitly_wait(10)

  

eg:

driver.implicitly_wait(10)
driver.get("https://www.baidu.com/")
try:
ele = driver.find_element(By.ID,"kw1")
except selenium.common.exceptions.NoSuchElementException as e:
print(dir(selenium.common.exceptions))
print(e)
except selenium.common.exceptions.TimeoutException as e:
print(e)
else:
ele.send_keys("hahah")
finally:
driver.quit()

  

b、显示的等待,需要用到2个模块

from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait

  

driver.get("https://www.baidu.com/")
try:
ele = WebDriverWait(driver,5,0.5).until(
EC.presence_of_element_located((By.ID,"kw1"))
)
except selenium.common.exceptions.TimeoutException as e:
print(e)
else:
ele.send_keys("hahaha") finally:
driver.quit()
print("hahaha")

  

c、EC这个模块有很多的方法,上面我们仅仅用到判断元素是否显示出来,其实还有很多的方法

print(dir(EC))
'NoAlertPresentException',
'NoSuchElementException',
'NoSuchFrameException',\
'StaleElementReferenceException', \
'WebDriverException', \
'_element_if_visible',\
'_find_element', \
'_find_elements',\
'alert_is_present', \
'element_located_selection_state_to_be',\
'element_located_to_be_selected',\
'element_selection_state_to_be', \
'element_to_be_clickable', \
'element_to_be_selected', \
'frame_to_be_available_and_switch_to_it', \
'invisibility_of_element_located', 判断元素是否不可见
'new_window_is_opened',\
'number_of_windows_to_be', \
'presence_of_all_elements_located', 判断一组元素是否存在
'presence_of_element_located', :判断元素是否存在
'staleness_of', \
'text_to_be_present_in_element',\:判断元素是否有xxx的文本信息
'text_to_be_present_in_element_value', :判断元素值是否有xxx的文本信息
'title_contains',:判断tilel中是否包含xxx
'title_is', :判断html的title
'url_changes',\
'url_contains',\
'url_matches',\
'url_to_be', \
'visibility_of',\是否可见
'visibility_of_all_elements_located', \判断一组元素是否都在存在
'visibility_of_any_elements_located',\判断一组元素是否有一个存在
'visibility_of_element_located':判断元素是否可见

  

我们现在看一个例子,判断一个html的title

driver.get("https://www.baidu.com/")
try:
ele = WebDriverWait(driver,15,0.5).until(
EC.presence_of_element_located((By.ID,"kw")))
except selenium.common.exceptions.TimeoutException as e:
print(e)
else:
ele.send_keys("hahah") try:
ret = WebDriverWait(driver,15,0.5).until(
EC.title_is("hahah")
)
except selenium.common.exceptions.TimeoutException as e:
print("tile不是hahaha")
else:
print("title is hahah") finally:
driver.quit()

  

7、多窗口的处理

这里处理的原则就是,先获取到指定页面的句柄,然后根据句柄切换到不同的窗口

a、获取当前的窗口的句柄

now_handle = dr.current_window_handle

  

b、获取打开的所有的句柄

all_handles = dr.window_handles

  

c、通过句柄切换到不同的窗口

dr.switch_to_window(handle)

  

eg:

now_handle = dr.current_window_handle
dr.find_element_by_partial_link_text(u"登录").click()
# dr.find_element_by_link_text("立即注册").click() all_handles = dr.window_handles
r = dr.find_element_by_xpath("//div[@class='tang-pass-footerBar']/a").text
print(r) for handle in all_handles:
if handle != now_handle:
dr.switch_to_window(handle)
print("当前是注册的窗口") dr.find_element_by_id("TANGRAM__PSP_3__userName").send_keys("11111111111")
time.sleep(5)
dr.close() dr.switch_to_window(now_handle)
dr.find_element_by_id("kw").send_keys("从注册页回来")
time.sleep(5)
dr.close()

  

8、告警框的处理

from selenium.webdriver.common.action_chains import ActionChains

ele = dr.find_element_by_partial_link_text("设置")
ActionChains(dr).move_to_element(ele).perform() ele = dr.find_element_by_link_text("搜索设置").click() ele = dr.find_element_by_css_selector("#gxszButton > a.prefpanelgo").click() dr.switch_to_alert().accept()
# 切换到告警框,点击确定 dr.switch_to_alert().text
# 获取警告框中的内容 dr.switch_to_alert().dismiss()
# 切换到警告框,然后点击取消 dr.switch_to_alert().send_keys("yyy")
# 切换到警告框,然后输入yyy

  

selenium学习一的更多相关文章

  1. 【转】selenium学习路线

    selenium学习路线 配置你的测试环境,真对你所学习语言,来配置你相应的selenium 测试环境.selenium 好比定义的语义---“问好”,假如你使用的是中文,为了表术问好,你的写法是“你 ...

  2. Selenium 学习笔记(一)

    selenium 学习整理 初学者,如果有不当得地方请指出,非常感谢. 准备事项: 1. Python 安装包 安装Python,并勾选添加环境变量. 安装完成后,打开dos窗口,输入python,看 ...

  3. selenium 学习之路开始了,一遍搬一遍理解学习,加油!!!

    selenium 学习之路开始了,一遍搬一遍理解学习,加油!!!

  4. Selenium学习第二天,了解Selenium工作模式与学习Selenium需要具备的知识与工具。

    Selenium学习网站: 1.http://www.ltesting.net/ceshi/open/kygncsgj/selenium/2014/0408/207237.html——好像是对API的 ...

  5. 【python+selenium学习】Python常见错误之:IndentationError: unexpected indent

    初入python+selenium学习之路,总会遇到这样那样的问题.IndentationError: unexpected indent,这个坑我已经踏进数次了,索性记录下来.都知道Python对代 ...

  6. selenium 学习笔记 ---新手学习记录(1) 问题总结

    说明:每次学习各种语言时,环境搭建访问国外网址最头疼了,现在只要是工具下载好放到自己网盘,可以随时用. 1.首先工具准备,selenium需要用到的 下载地址 访问密码 ff8f 2.我选择的语言时j ...

  7. Selenium学习资源和网站

    用于收集常用的网站和学习资源: 文章: Selenium私房菜系列--总章 WEB 自动化测试工具 Selenium 简介及其应用 Selenium教程 和我一起学 Selenium WebDrive ...

  8. 【工具篇】Selenium 学习实践(一)环境搭建

    一.环境搭建 (1)初学者最佳环境: Python 2.7 + Selenium 2+ Firefox 46 (2)喜欢尝新的环境: Python 3.6 + Selenium 3+ Firefox ...

  9. selenium学习笔记(简单的元素定位)

    收拾一下心情开始新的一周工作 继续是selenium的学习.配置成功后 由于所有操作都是建立在页面元素基础上的.所以下来就是学习定位元素 首先是基础的定位.就使用博客园首页搜索框为例: 下面是代码: ...

随机推荐

  1. EMQ笔记

    飞行窗口(Inflight Window)保存当前正在发送未确认的Qos1/2消息.窗口值越大,吞吐越高:窗口值越小,消息顺序越严格. 当客户端离线或者飞行窗口(Inflight Window)满时, ...

  2. sourcetree 跳过注册

    https://www.cnblogs.com/lucio110/p/8192792.html

  3. NAT与FULL NAT的区别

    LVS 当前应用主要采用 DR 和 NAT 模式,但这 2 种模式要求 RealServer 和 LVS在同一个 vlan中,导致部署成本过高:TUNNEL 模式虽然可以跨 vlan,但RealSer ...

  4. mysql 的sleep线程过多处理方法

    php程序不要使用长连接:java程序调整连接池 什么是长连接? 其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态. 通常的短连接操作步骤是: 连接->数据传输-& ...

  5. Visual Studio配置C/C++-PostgreSQL(9.6.3)开发环境(ZT)

    https://www.2cto.com/database/201707/658910.html 开发环境 Visual Studio 2017[15.2(26430.16)] PostgreSQL ...

  6. linux 3.10的list_del

    最近看到一个page的数据比较奇怪: crash> page ffffea002c239c58 struct page { flags = , _count = { counter = 34-- ...

  7. ReactiveX 学习笔记(9)工具类操作符

    Observable Utility Operators 本文的主题为处理 Observable 的实用工具类操作符. 这里的 Observable 实质上是可观察的数据流. RxJava操作符(六) ...

  8. Python基本模块介绍:sys、platform

    sys模块 常用函数 sys.argv 命令行参数,实现从程序外部向程序传递参数. sys.path 模块搜索路径. sys.platform 获取当前系统平台. sys.version 获取pyth ...

  9. javascript单线程那些事

    首先,说下为什么 JavaScript 是单线程? 总所周知,JavaScript是以单线程的方式运行的.说到线程就自然联想到进程.那它们有什么联系呢? 进程和线程都是操作系统的概念.进程是应用程序的 ...

  10. python类和对象的底层实现

    按照python中"一切皆对象的原理",所有创建的对象,都是一个已知存在的class实例化的结果;那么class又是被哪个"类"实例化的呢?先看下面的一段代码 ...