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
 
                    
                 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号