Python的自动化操作 Selenium库的基本语法和使用详解

首页 » Python » Python的自动化操作 Selenium库的基本语法和使用详解

Selenium模块的原理及驱动程序的下载和配置 简单的元素查找中,我们已经知道了selenium的基本使用,这篇文章再来总结一下

下面的代码包含了selenium库所有基本知识,代码比较多。为什么要找kw呢,就是为了找到百度的输入框,然后输入Python值,回车

from selenium import webdriver # 基础包
from selenium.webdriver.common.by import By # 自定制查询条件
from selenium.common.exceptions import TimeoutException # 超时异常
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC # 
from selenium.webdriver.support.wait import WebDriverWait # 设置等待时间,超过就会抛出超时异常
browser=webdriver.Chrome()  #声明浏览器启动对象
try:
    browser.get('http://www.baidu.com')   #.get方法,随便传入url
    input=browser.find_element_by_id('kw')  #find_element_by_id()找到id='kw'的元素
    input.send_keys('python')  #向元素里面发送键
    input.send_keys(Keys.ENTER) #敲入回车键
    wait=WebDriverWait(browser,10)  #等待10s
    wait.until(EC.presence_of_element_located((By.ID,'content_left'))  )
    print(browser.current_url)
    print(browser.get_cookies())
    print(browser.page_source)
finally:
    browser.close()

声明浏览器对象

from selenium import webdriver
browser=webdriver.Chrome() #谷歌浏览器
browser=webdriver.Firefox() #火狐浏览器
browser=webdriver.Safari()  #国人很少用的浏览器safari
browser=webdriver.Edge()   #微软旗下的浏览器
browser=webdriver.PhantomJS()  #无界面浏览器

访问页面

from selenium import webdriver
browser=webdriver.Chrome() #谷歌浏览器
browser.get('http://www.e1yu')
print(browser.page_source)
browser.close()

查找元素

元素的查找分单个元素和多个元素,两者的区别就是,后者加了s,比较简单。我们也可以使用下面的方式查找元素:

from selenium import webdriver
from selenium.webdriver.common.by import  By #使用下面的方法需要先导入By
browser=webdriver.Chrome() #谷歌浏览器
browser.get('https://www.sina.com.cn/')
input=browser.find_element(By.CLASS_NAME,'inp-txt')
input_first=browser.find_element(By.CSS_SELECTOR,'.inp-txt')
input_second=browser.find_element(By.XPATH,'/html/body/div[9]/div/div[1]/form/div[3]/input')
print(input)
print(input_first)
print(input_second)
browser.close()

元素交互操作

对获取的元素调用交互方法

from selenium import webdriver
import time
browser=webdriver.Chrome() #谷歌浏览器
browser.get('https://www.sina.com.cn/')
input=browser.find_element_by_class_name('inp-txt')  #这里选择的是新浪网的输入框
input.send_keys('家暴')  #输入内容
time.sleep(1)  #等待1s
input.clear()  #清空输入框
input.send_keys('美女')
buttom=browser.find_element_by_class_name('submit-second-btn')  #查找搜索按钮
buttom.click() #点击搜索按钮

更多操作方法:官方文档,里面的内容是非常的详细,比我总结的更加细致。

交互动作

将动作附加到动作链中串行执行,驱动浏览器为我们执行一些交互动作,但是和上面有所不同的是,这里可以在网页上进行拖拽动作

from selenium import webdriver
from selenium.webdriver import ActionChains

browser=webdriver.Chrome()
url='https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'
browser.get(url)  #请求url
browser.switch_to_frame('iframeResult')  #传入frame的id
source=browser.find_element_by_id('draggable') #找到'请拖拽我'的方框
target=browser.find_element_by_id('droppable') #找到'请放置到这里'的方框
actions=ActionChains(browser)  #声明一个动作链
actions.drag_and_drop(source,target) #用actions调用这么一个方法
actions.perform() #最后必须加上这个方法

更多详细操作见官方文档

执行JavaScript

我们在做一些元素交互动作的时候,可能它有些动作没有提供API,比方说我们要模拟人操控网页,实现进度条的下拉动作,采用元素交互的方式实现比较困难的情况下,就可以使用这种方式操作,可以说是比较万能的。想要熟练的运用,你可能还要具备一些JavaScript知识。

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('http://www.zhihu.com/explore')
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') #滚动条滑到页面底部
browser.execute_script('alert("TO back")') #在网页中显示相关提示

获取元素信息

获取属性和内容

方法都比较简单,了解一下即可

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.sina.com.cn/')
logo=browser.find_element_by_class_name('sina-logo') #查找的是新浪网的LOGO
print(logo.get_attribute('class')) #获取class的属性值
abb=browser.find_element_by_id('weatherBox') #获取的是搜索框右边的地区天气
print(abb.text)  #获取该地区

获取ID、位置、标签名、大小

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.sina.com.cn/')
logo=browser.find_element_by_class_name('sina-logo') #查找的是新浪网的LOGO
print(logo.get_attribute('class')) #获取class的属性值
abb=browser.find_element_by_id('weatherBox') #获取的是搜索框右边的地区天气
print(abb.text)  #获取该地区
print(abb.id)  #获取ID
print(abb.location)  #获取位置
print(abb.tag_name)  #标签名
print(abb.size)  #大小
browser.close()

这里要注意代码规范,操作完成之后关闭浏览器。

Frame

网页中如果出现了frame,我们在做元素筛选的时候,会遇到一些问题。frame相当于一个独立的网页,那么我们如果想要在父级frame里面查找子元素的frame,是必须要切换到这个frame里面才可以,那么就可以使用这种方法。

from selenium import webdriver
from selenium.common.exceptions import  NoSuchElementException

browser=webdriver.Chrome()
browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
browser.switch_to_frame('iframeResult')
source=browser.find_element_by_css_selector('#draggable')
print(source)
try:
    logo=browser.find_element_by_class_name('navbar-header')
except NoSuchElementException:
    print('NO LOGO') #在子frame里面获取父frame中的LOGO,很显然是不行的
browser._switch_to.parent_frame() #要想获取,必须切换到父frame里面才行
logo=browser.find_element_by_class_name('navbar-header')
print(logo)
print(logo.text) #这样就成功的获取到了LOGO

等待

隐式等待

如果使用了隐式等待执行测试的话,WebDriver没有在DOM中找到元素,将继续等待,超出设定的时间,将会抛出找到不元素的异常。

from selenium import webdriver

browser=webdriver.Chrome()
browser.implicitly_wait(10)
browser.get('https://www.sina.com.cn/')
footer=browser.find_element_by_id('footer')
print(footer)
browser.close()

显式等待

这种方式比较常用,指定一个等待条件,指定一个最长等待时间,它会在这个最长等待时间内判断这个条件是否成立,如果成立就会返回,如果不成立,那么它会一直等待,直到最长的等待时间位置,条件如果还不成立的话,则抛出异常。这种方式对于呢些电脑配置不太好,网速还不行的用户是非常有帮助的,当然也包括我在内,你在实际操作中肯定会遇到NoSuchElementException: Message: Unable to locate element报错信息,那么,这种情况可能就是元素没加载完成,在检查了定位方式无误后,就是你网速或者电脑配置的原因,你就可以加入这种等待方式。

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

browser=webdriver.Chrome()
browser.get('https://www.sina.com.cn/')
wait=WebDriverWait(browser,10)

foote=wait.until(EC.presence_of_element_located((By.ID,'footer')))

print(foote)
browser.close()

使用这种方法,须到导入很多的库,这一点需要注意。更多详细操作:

官方文档

前进后退

from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.get('https://www.sina.com.cn/')
browser.get('http://taobao.com')
browser.back() #后退
time.sleep(1)
browser.forward() #前进
browser.close()

Cookies

用来爬取登录之后的页面,方法很简单

from selenium import webdriver
browser=webdriver.Chrome()
browser.get('https://www.sina.com.cn/')
print(browser.get_cookies()) #首先把新浪的cookies打印出来
browser.add_cookie({'name':'name','domain':'sina.com','value':'germay'}) #自己添加一个cookies
print(browser.get_cookies()) #获得cookies
browser.delete_all_cookies()  #再把所有的cookies清空掉
print(browser.get_cookies())  #再次打印cookies
browser.close()

选项卡管理

就是新建标签页,实现来回更换操作,通过执行一个js来实现。

from selenium import webdriver
import time
browser=webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.execute_script('window.open()') #采用js打开新的标签页
print(browser.window_handles)  #返回所有的标签页的代号
browser.switch_to.window(browser.window_handles[1]) #切换到第二个标签页
browser.get('http://www.taobao.com') #打开淘宝
time.sleep(1) 
browser.switch_to.window(browser.window_handles[0]) #切换到索引为0,就是第一个标签页
browser.get('http://www.sina.com.cn')
browser.close()

异常处理

这个selenium库的异常处理是比较麻烦的,浏览器里面可能会出现各种各样的异常,某个元素无法点击,或者是加载超时,或者没有找到这个元素的异常,大部分都是受网络和电脑配置的影响,这里只是简单的做一下介绍,要想了解更多的内容,你可以查看官方文档。

当我们在查找一个不存在的元素的时候,通常会报selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element:的错误,那么可以根据错误信息,来抓取异常。

from selenium import webdriver
from selenium.common.exceptions import TimeoutException,NoSuchElementException
browser=webdriver.Chrome()
try:
    browser.get('http://www.baidu.com')
except TimeoutException:
    print('Time Out')
try:
    browser.find_element_by_id('abc')
except NoSuchElementException:

    print('NOT Found')
finally:
    browser.close()

更多内容:官方文档

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Python的自动化操作 Selenium库的基本语法和使用详解》 发布于2019-11-28

分享到:
赞(0) 赏杯咖啡

评论 抢沙发

2 + 9 =


文章对你有帮助可赏作者一杯咖啡

支付宝扫一扫打赏

微信扫一扫打赏

Vieu4.6主题
专业打造轻量级个人企业风格博客主题!专注于前端开发,全站响应式布局自适应模板。
切换注册

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

Q Q 登 录
微 博 登 录
切换登录

注册