Python+Selenium自动化总结

Python+Selenium自动化总结

一、环境搭建

1.一、安装selenium模块文件

pip install selenium

1.二、安装ChromeDriver驱动

【1】下载安装Chrome浏览器。css

【2】查看Chrome版本。html

  • 点击Chrome菜单“帮助”→“关于Google Chrome”,查看Chrome的版本号。
    【3】下载对应ChromeDriver驱动。
  • 官方网站:https://sites.google.com/a/chromium.org/chromedriver
  • 下载地址:https://chromedriver.storage.googleapis.com/index.html

【4】环境变量配置。python

  • 在Windows下,下载完成后,将ChromeDriver的可执行文件chromedriver.exe文件拖到Python的Scripts目录下。

1.三、安装GeckoDriver驱动(Firefox浏览器)

【1】下载GeckoDriver驱动。ios

  • 在GitHub上找到GeckoDriver的发行版本,而后根据本身的系统和位数选择对应的驱动下载。
  • GitHub:https://github.com/mozilla/geckodriver
  • 下载地址:https://github.com/mozilla/geckodriver/releases

【2】环境变量配置nginx

  • 在Windows下,直接将geckodriver.exe文件拖到Python的Scripts目录下。

二、基本使用方法

2.一、初始化浏览器驱动

# 0、导入模块文件
from selenium import webdriver

# 一、初始化浏览器为chrome浏览器
browser = webdriver.Chrome()

# 二、初始化浏览器为firefox浏览器
browser = webdriver.Firefox()

# 三、初始化浏览器为无界面的chrome浏览器
option = webdriver.ChromeOptions()
option.add_argument("headless")
driver = webdriver.Chrome(chrome_options=option)

2.二、设置浏览器大小

  • maximize_window():设置浏览器大小为全屏
  • set_window_size(500,500):设置浏览器分辨率为:500×500
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.maximize_window()   #设置浏览器大小:全屏
browser.get('https://www.baidu.com') 
time.sleep(2)

browser.set_window_size(500,500)  # 分辨率 1280*800  
time.sleep(2)

browser.set_window_size(1024,768)  # 分辨率 1024*768  
time.sleep(2)

2.三、刷新浏览器页面

  • refresh()方法:刷新浏览器页面
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.maximize_window()   #设置浏览器大小:全屏
browser.get('https://www.baidu.com')  
time.sleep(1)

try:
    browser.refresh()  #刷新页面
    print('刷新页面')
except Exception as e:
    print('test fail')

#输出内容:刷新页面

2.四、浏览器后退和前进

  • back():后退
  • forward():前进
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.maximize_window()   #设置浏览器大小:全屏
browser.get('https://www.baidu.com')  

#点击打开百度新闻页面
browser.find_element_by_link_text('新闻').click()
time.sleep(2)

browser.back()  #后退:回到百度首页
time.sleep(2)

browser.forward()  #前进:前进到百度新闻页面
time.sleep(2)

三、获取页面信息

3.一、页面title

  • title:获取当前页面的标题显示的字段
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#打印网页标题
print(browser.title)
#输出内容:百度一下,你就知道

3.二、页面URL

  • current_url:获取当前页面的URL
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com') 

#打印网页标题
print(browser.current_url)
#输出内容:https://www.baidu.com/

3.三、浏览器版本号

  • capabilities['version']):打印浏览器version的值
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#打印网页标题
print(browser.capabilities['version'])
#输出内容:67.0.3396.87

3.四、元素尺寸

  • size:返回元素的尺寸
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#定位输入框
input_box = browser.find_element_by_id('kw')
#打印输入框尺寸
print(input_box.size)
#输出内容:{'height': 22, 'width': 500}

3.五、元素的文本

  • text:返回元素的文本信息
from selenium import webdriver
import time  

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  

#定位备案元素
recordcode = browser.find_element_by_id('jgwab')
#打印备案元素信息
print(recordcode.text)
#输出内容:京公网安备11000002000001号

3.六、元素属性值

  • get_attribute('')方法
  • get_attribute('href'):获取href属性值
  • get_attribute('id'):获取id属性值
# coding=utf-8
import time
from selenium import webdriver


driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
driver.get("https://www.baidu.com")
time.sleep(1)

for link in driver.find_elements_by_xpath("//*[@href]"):
    print (link.get_attribute('href'))
driver.quit()

四、定位页面元素

4.一、ID定位元素

from selenium import webdriver
# 设置浏览器
browser = webdriver.Chrome()
#设置浏览器大小:全屏
browser.maximize_window()
#打开百度首页
browser.get('https://www.baidu.com/')
#定位百度搜索输入框以前,先分析下它的html结构
#<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
#发现它的 id="kw" ,接下来咱们就经过id进行定位
try:
    browser.find_element_by_id('kw').send_keys('哈哈')
    print('test post:id')
except Exception as e:
    print('test fail')
 #输出内容:test post:id

4.二、name定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
#搜索框的html结构:<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
# 根据name属性定位
try:
    browser.find_element_by_name('wd').send_keys('哈哈')
    print('test post:name')
except Exception as e:
    print('test fail')

#输出内容:test post:name

4.三、class定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
#搜索框的html结构:<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
# 根据class_name属性定位
try:
    browser.find_element_by_class_name('s_ipt').send_keys('哈哈')
    print('test post:class_name')
except Exception as e:
    print('test fail')

#输出内容:test post:class_name

4.四、tag_name定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
#搜索框的html结构:<input type="text" class="s_ipt nobg_s_fm_hover" name="wd" id="kw" maxlength="100" autocomplete="off">
# 根据tag_name属性定位
try:
    browser.find_element_by_tag_name('form')
    print('test post:tag_name')
except Exception as e:
    print('test fail')

#输出内容:test post:tag_name

4.五、link_text定位元素

  • link_text:根据跳转连接上面的文字来定位元素。
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
# 根据link_text属性定位元素“新闻”,而后点击按钮
try:
    browser.find_element_by_link_text('新闻').click()
    print('test post:tag_name')
except Exception as e:
    print('test fail')

#输出内容:test post:link_text

4.六、partial_link_text定位元素

  • 和link_text定位元素差很少,partial_link_text是经过文字信息中的部分字段来定位元素。
from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
# 根据partial_link_text属性定位元素“新闻”,而后点击按钮
try:
    browser.find_element_by_partial_link_text('闻').click()
    print('test post:tag_name')
except Exception as e:
    print('test fail')

#输出内容:test post:partial_link_text

4.七、xpath定位元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
# 根据xpath定位元素
try:
    browser.find_element_by_xpath('//*[@id="kw"]').send_keys('哈哈')
    print('test post:xpath')
except Exception as e:
    print('test fail')

#输出内容:test post:xpath

4.八、CSS定位页面元素

from selenium import webdriver
browser = webdriver.Chrome()
browser.maximize_window()

#打开百度首页
browser.get('https://www.baidu.com/')
# 根据css_selector定位元素
try:
    browser.find_element_by_css_selector('#kw').send_keys('哈哈')
    print('test post:xpath')
except Exception as e:
    print('test fail')

#输出内容:test post:css_selector

4.九、By定位

  • 除了使用上面的方法外,还能够利用find_element()方法,经过By来定位元素。
  • 使用以前须要导入By类:
#导入By类
from selenium.webdriver.common.by import By
  • 那么上面的方法还能够改写为:
browser.find_element(By.ID,'kw')
browser.find_element(By.NAME,'wd')
browser.find_element(By.CLASS_NAME,'s_ipt')
browser.find_element(By.TAG_NAME,'form')
browser.find_element(By.LINK_TEXT,'新闻')
browser.find_element(By.PARTIAL_LINK_TEXT,'闻')
browser.find_element(By.XPATH,'//*[@id="kw"]')
browser.find_element(By.CSS_SELECTOR,'#kw')

4.十、定位一组元素

  • 定位一组元素和定位某个元素差很少,惟一区别就是在单词element后面增长了一个s表示复数:
find_elements_by_id('')
find_elements_by_id_by_class_name('')
find_elements_by_tag_name('')
find_elements_by_link_text('')
find_elements_by_partial_link_text('')
find_elements_by_xpath('')
find_elements_by_css_selector('')

五、页面操做

5.一、输入内容:send_keys()

#定位输入框
input_box = browser.find_element_by_id('kw')
#输入内容
input_box.send_keys('关键字')

5.二、点击按钮:click()

#定位搜索按钮
button = browser.find_element_by_id('su')
button.click()

5.三、清空输入框:clear()

#定位输入框
input_box = browser.find_element_by_id('kw')
#清空输入框
input_box.clear()

5.四、模拟'回车'操做:submit()

  • submit():一般应用于提交表单;例如:搜索框输入内容后的回车操做。
from selenium import webdriver

browser = webdriver.Chrome()
browser.maximize_window()
browser.get('https://www.baidu.com')

# 定位输入框
input_box = browser.find_element_by_id('kw')
# 输入关键词
input_box.send_keys('关键字')
# 模拟回车操做
input_box.submit()

5.五、单选框选中

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('http://news.baidu.com/')
time.sleep(1)

try:
    #定位搜索框下面的新闻全文和新闻标题单选项
    radio_button = driver.find_elements_by_css_selector(".search-radios>input")
    # 定位的一组元素后,返回的是一个列表,这里就循环选中对应的选项
    for i in radio_button:
        i.click()
    print ('选中单选框.')
except Exception as e:
    print ('fail',format(e))

5.五、复选框选中

from selenium import webdriver
import time
driver = webdriver.Chrome()
driver.maximize_window()
driver.get('https://passport.baidu.com/v2/?reg&tt=1529850358050&overseas=undefined&gid=02B2650-6D11-430E-A19D-529F69B9F1CE&tpl=xw&u=http%3A%2F%2Fnews.baidu.com%2F')
time.sleep(1)

try:
    #定位 阅读并接受《百度用户协议》及《百度隐私权保护声明》 的多选框
    checkbox = driver.find_elements_by_css_selector("#TANGRAM__PSP_3__isAgree")
    # 定位的一组元素后,返回的是一个列表,这里就循环选中对应的选项
    for i in checkbox:
        i.click()
    print ('选中多选框')
except Exception as e:
    print ('fail',format(e))

5.六、操做下拉框:Select模块(index)

  • selenium提供了Select模块,能够直接根据属性或索引定位。

【1】导入select方法:git

from selenium.webdriver.support.select import Select

【2】Select模块中的定位方法。github

'''一、三种选择某一选项项的方法'''

select_by_index()           # 经过索引定位;注意:index索引是从“0”开始。
select_by_value()           # 经过value值定位,value标签的属性值。
select_by_visible_text()    # 经过文本值定位,即显示在下拉框的值。

'''二、三种返回options信息的方法'''

options                     # 返回select元素全部的options
all_selected_options        # 返回select元素中全部已选中的选项
first_selected_options      # 返回select元素中选中的第一个选项 


'''三、四种取消选中项的方法'''

deselect_all                # 取消所有的已选择项
deselect_by_index           # 取消已选中的索引项
deselect_by_value           # 取消已选中的value值
deselect_by_visible_text    # 取消已选中的文本值

【3】使用实例web

'''这个是我百度首页搜索设置里面的一个下拉框html代码'''
html = ''' <select name="NR" id="nr"> <option value="10" selected="">每页显示10条</option> <option value="20">每页显示20条</option> <option value="50">每页显示50条</option> </select> '''

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.support.select import Select

# 初始化
driver = webdriver.Chrome()
......

'''若是咱们须要选择:50条,那么能够用下面的三种方法 先选中输入框元素,而后在选择对应选项'''
# 根据索引选择
Select(driver.find_element_by_name("NR")).select_by_index("2")
# 根据value值选择
Select(driver.find_element_by_name("NR")).select_by_value("50")
# 根据文本值选择
Select(driver.find_element_by_name("NR")).select_by_visible_text("每页显示50条")

driver.quit()

5.七、多个浏览器窗口切换

切换浏览器窗口的时候将会用到的三个方法:ajax

  • current_window_handle:获取当前窗口的句柄。
  • window_handles:返回当前浏览器的全部窗口的句柄。
  • switch_to_window():用于切换到对应的窗口。
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://www.baidu.com/")

# 获取当前窗口句柄
seacher_windows = driver.current_window_handle

# 跳转新页面
driver.find_element_by_xpath('//*[@id="block1_server"]/div[2]/ul/li[1]/div/div[1]/a[3]').click()

all_handles = driver.window_handles
#回到首页
for handle in all_handles:
    if handle != seacher_windows:
        driver.switch_to.window(seacher_windows)

六、模拟鼠标操做:ActionChains类

【1】使用以前须要引入 ActionChains 类。chrome

from selenium.webdriver.common.action_chains import ActionChains

【2】ActionChains类提供的鼠标经常使用方法:

  • perform():执行全部 ActionChains 中存储的行为。
  • context_click():右击
  • double_click():双击
  • drag_and_drop():拖到
  • move_to_element():鼠标悬停

6.一、鼠标右击实例

from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains  # 引入 ActionChains 类

browser = webdriver.Chrome()
browser.get('https://www.baidu.com')  


# 定位到要右击的元素
right_click = browser.find_element_by_link_text('新闻')

# 对定位到的元素执行鼠标右键操做
#ActionChains(driver):调用ActionChains()类,并将浏览器驱动browser做为参数传入
#context_click(right_click):模拟鼠标双击,须要传入指定元素定位做为参数
#perform():执行ActionChains()中储存的全部操做,能够看作是执行以前一系列的操做
try:
    ActionChains(browser).context_click(right_click).perform()
    print('成功右击')
except Exception as e:
    print('fail')
#输出内容:成功双击

注意:

  • ActionChains(driver):调用ActionChains()类,并将浏览器驱动browser做为参数传入
  • context_click(right_click):模拟鼠标双击,须要传入指定元素定位做为参数
  • perform():执行ActionChains()中储存的全部操做,能够看作是执行以前一系列的操做

6.二、鼠标右击:context_click()

# 鼠标右击
# 定位到要右击的元素
right_click  = browser.find_element_by_id("xx")
 # 对定位到的元素执行右击操做
ActionChains(browser).move_to_element(right_click ).perform()

6.三、鼠标双击:double_click()

# 定位到要右击的元素
double_click = browser.find_element_by_id('xx')

# 对定位到的元素执行鼠标右键操做
ActionChains(browser).context_click(double_click).perform()

6.四、鼠标拖动:drag_and_drop(source,target)

  • source:开始位置;须要拖动的元素
  • target:结束位置;拖到后须要放置的目的地元素
# 开始位置:定位到元素的原位置
source = driver.find_element_by_id("xx")

# 结束位置:定位到元素要移动到的目标位置
target = driver.find_element_by_id("xx")

# 执行元素的拖放操做
ActionChains(driver).drag_and_drop(source,target).perform()

6.五、鼠标悬停:move_to_element()

# 定位到要悬停的元素
move = driver.find_element_by_id("xx")

# 对定位到的元素执行悬停操做
ActionChains(driver).move_to_element(move).perform()

七、模拟键盘操做

  • selenium中的Keys()类提供了大部分的键盘操做方法;经过send_keys()方法来模拟键盘上的按键。

【1】导入键盘类 Keys()

from selenium.webdriver.common.keys import Keys

7.一、经常使用的键盘操做:

  • send_keys(Keys.BACK_SPACE):删除键(BackSpace)
  • send_keys(Keys.SPACE):空格键(Space)
  • send_keys(Keys.TAB):制表键(TAB)
  • send_keys(Keys.ESCAPE):回退键(ESCAPE)
  • send_keys(Keys.ENTER):回车键(ENTER)
  • send_keys(Keys.CONTRL,'a'):全选(Ctrl+A)
  • send_keys(Keys.CONTRL,'c'):复制(Ctrl+C)
  • send_keys(Keys.CONTRL,'x'):剪切(Ctrl+X)
  • send_keys(Keys.CONTRL,'v'):粘贴(Ctrl+V)
  • send_keys(Keys.F1):键盘F1
  • .....
  • send_keys(Keys.F12):键盘F12

7.二、键盘操做实例

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

driver=webdriver.Chrome()  
driver.get("http://www.baidu.com")  
#输入关键词内容
driver.find_element_by_id("kw").send_keys("selenium")  
#删除键
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)  
#空格键 
driver.find_element_by_id("kw").send_keys(Keys.SPACE)  
#输入内容
driver.find_element_by_id("kw").send_keys("教程")  
#全选(Ctrl+A) 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a') 
#剪切(Ctrl+X) 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'x') 
#粘贴(Ctrl+V) 
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')  
#回车键 
driver.find_element_by_id("kw").send_keys(Keys.ENTER)

八、设置页面等待加载条件

[toc]

若是遇到使用ajax加载的网页,页面元素可能不是同时加载出来的,这个时候,就须要咱们经过设置一个等待条件,等待页面元素加载完成,避免出现由于元素未加载致使的错误的出现。

WebDriver提供了两种等待类型:显示等待、隐式等待。

8.一、显示等待:WebDriverWait()类+ExpectedCondition类

  • 显示等待:设置一个等待时间和一个条件,在规定时间内,每隔一段时间查看下条件是否成立,若是成立那么程序就继续执行,不然就提示一个超时异常(TimeoutException)。
  • 一般状况下WebDriverWait类会结合ExpectedCondition类一块儿使用。

【实例】

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

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 设置浏览器:driver 等待时间:20s
wait = WebDriverWait(driver, 20)
# 设置判断条件:等待id='kw'的元素加载完成
input_box = wait.until(EC.presence_of_element_located((By.ID, 'kw')))
# 在关键词输入:关键词
input_box.send_keys('关键词')

8.1.一、WebDriverWait的具体参数和方法:

WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
    driver: 浏览器驱动
    timeout: 超时时间,等待的最长时间(同时要考虑隐性等待时间)
    poll_frequency: 每次检测的间隔时间,默认是0.5秒
    ignored_exceptions:超时后的异常信息,默认状况下抛出NoSuchElementException异常


until(method,message='')
    method: 在等待期间,每隔一段时间调用这个传入的方法,直到返回值不是False
    message: 若是超时,抛出TimeoutException,将message传入异常


until_not(method,message='')
    until_not 与until相反,until是当某元素出现或什么条件成立则继续执行,
    until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。
    method
    message

8.1.二、设置页面加载判断条件:ExpectedCondition

  • ExpectedCondition中可以使用的判断条件:
from selenium.webdriver.support import expected_conditions as EC
 # 判断标题是否和预期的一致
title_is
# 判断标题中是否包含预期的字符串
title_contains
 # 判断指定元素是否加载出来
presence_of_element_located
# 判断全部元素是否加载完成
presence_of_all_elements_located
 # 判断某个元素是否可见. 可见表明元素非隐藏,而且元素的宽和高都不等于0,传入参数是元组类型的locator
visibility_of_element_located
# 判断元素是否可见,传入参数是定位后的元素WebElement
visibility_of
# 判断某个元素是否不可见,或是否不存在于DOM树
invisibility_of_element_located
 # 判断元素的 text 是否包含预期字符串
text_to_be_present_in_element
# 判断元素的 value 是否包含预期字符串
text_to_be_present_in_element_value
 #判断frame是否可切入,可传入locator元组或者直接传入定位方式:id、name、index或WebElement
frame_to_be_available_and_switch_to_it
 #判断是否有alert出现
alert_is_present
 #判断元素是否可点击
element_to_be_clickable
 # 判断元素是否被选中,通常用在下拉列表,传入WebElement对象
element_to_be_selected
# 判断元素是否被选中
element_located_to_be_selected
# 判断元素的选中状态是否和预期一致,传入参数:定位后的元素,相等返回True,不然返回False
element_selection_state_to_be
# 判断元素的选中状态是否和预期一致,传入参数:元素的定位,相等返回True,不然返回False
element_located_selection_state_to_be
 #判断一个元素是否仍在DOM中,传入WebElement对象,能够判断页面是否刷新了
staleness_of

【调用方法以下】

WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)

8.二、隐式等待:implicitly_wait()

  • implicitly_wait(xx):设置等待时间为xx秒,等待元素加载完成,若是到了时间元素没有加载出,就抛出一个NoSuchElementException的错误。
  • 注意:隐性等待对整个driver的周期都起做用,因此只要设置一次便可。
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(30)  # 隐性等待,最长等30秒

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

print(driver.current_url)
print(driver.title)

8.三、强制等待:sleep()

  • 强制等待:无论浏览器元素是否加载完成,程序都得等待3秒,3秒一到,继续执行下面的代码。
from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://www.baidu.com')

sleep(3)  # 强制等待3秒再执行下一步

print(driver.title)
相关文章
相关标签/搜索