Selenium模块的原理及驱动程序的下载和配置 简单的元素查找

首页 » Python » Selenium模块的原理及驱动程序的下载和配置 简单的元素查找

Selenium 是一个 Web 应用的自动化框架,支持多种浏览器。使用它可以非常便捷的捕获到任意形式的动态加载出来的数据,可见即可得,但是爬取数据的效率低,还可以用来实现模拟登录。爬虫中主要用来解决JavaScript渲染问题。

Selenium原理

selenium主要就是通过操作浏览器驱动,来达到我们想要的目的,这里的原理跟我们人手动去操作浏览器差不多。主要说一下浏览器驱动的安装。浏览器驱动 也是一个独立的程序,是由浏览器厂商提供的,浏览器驱动 是和 浏览器对应的。 不同的浏览器 需要选择不同的浏览器驱动。 比如 Chrome浏览器和 火狐浏览器有 各自不同的驱动程序。这里只给出比较常用的浏览器驱动下载:chromedriver geckodriver 驱动程序

浏览器驱动 必须要和浏览器版本匹配,下图红圈里面的版本号 就是和浏览器版本号对应的

你需要查看一下当前Chrome浏览器的版本,下载对应版本的驱动程序。在设置中找到关于Chrome,就可看到浏览器的版本信息了:

Selenium模块的原理及驱动程序的下载和配置 简单的元素查找

比如:当前Chrome浏览器版本是74, 就需要下载74开头的目录里面的驱动程序 。打开目录,里面有3个zip包,分别对应Linux、Mac、Windows平台。如果我们是Windows平台的电脑,就下载 chromedriver_win32.zip这是个zip包,下载下来之后,解压里面的程序文件 chromedriver.exe ,那么这里建议直接放到Python.exe程序目录下,或者将路径加入到环境变量中也是可以的。

Selenium安装

在Python中安装selenium非常简单:pip install selenium即可

Selenium简单使用

from selenium import webdriver

# 创建 WebDriver 对象,指明使用chrome浏览器驱动
driver = webdriver.Chrome() #直接放在Python程序目录,就不用写路径

# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
driver.get('http://www.e1yu')

代码也是非常的简单,我觉得不用再详细解释了,自己照着敲敲记记就可以了。

Selenium选择元素

我们打开了某个网站之后,就需要做一些相关的操作,比方说搜索啊、点击啊等等一些人可以做到的事情,那么我们的程序也可以做到

根据 元素的id属性选择元素

from selenium import webdriver
# 创建 WebDriver 对象,指明使用chrome浏览器驱动
driver=webdriver.Chrome()

# 调用WebDriver 对象的get方法 可以让浏览器打开指定网址
driver.get('https://www.baidu.com/')

# 根据id选择元素,返回的就是该元素对应的WebElement对象
search=driver.find_element_by_id('kw') #kw为百度搜索框的id属性值

# 通过该 WebElement对象,就可以对页面元素进行操作了
# 比如输入字符串到 这个 输入框里
search.send_keys('妹子图片')

根据 class属性、tag名选择元素

html页面中不仅有id属性,也有class属性和标签名,同样我们也可以选择除id之外的属性:

from selenium import webdriver

# 创建 WebDriver 实例对象,指明使用chrome浏览器驱动
driver = webdriver.Chrome()

# WebDriver 实例对象的get方法 可以让浏览器打开指定网址
driver.get('https://www.meizitu.com/')

# 根据 class name 选择元素,返回的是 一个列表
# 里面 都是class 属性值为 tags的元素对应的 WebElement对象
elements = driver.find_elements_by_class_name('tags')

# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
    print(element.text)
from selenium import webdriver

driver = webdriver.Chrome()

driver.get('http://baidu.com')

# 根据 tag name 选择元素,返回的是 一个列表
# 里面 都是 tag 名为 div 的元素对应的 WebElement对象
elements = driver.find_elements_by_tag_name('div')

# 取出列表中的每个 WebElement对象,打印出其text属性的值
# text属性就是该 WebElement对象对应的元素在网页中的文本内容
for element in elements:
    print(element.text)

总结一下selenium常用的查找元素的方法:

查找单个元素:
find_element_by_id(通过id)
find_element_by_name(通过name)
find_element_by_xpath(xpath定位)
find_element_by_link_text(a标签中的文本定位)
find_element_by_partial_link_text(部分文本)
find_element_by_tag_name(标签name)
find_element_by_class_name(class属性的name)
find_element_by_css_selector(css选择器)
 
查找多个元素:
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector

单个元素跟多个元素之间就差一个s,对于css选择器、xpath、css select都可以使用浏览器自带的工具找到:

Selenium模块的原理及驱动程序的下载和配置 简单的元素查找
方法find_element和find_elements,还可以通过传入参数来指定功能。

from selenium.webdriver.common.by import By
driver.find_element(By.XPATH, '//button[text()="Some text"]')
# 通过xpath表达式来查找,方法中第一个参数是指定选取元素的方式,第二个参数是选取元素需要传入的值或表达式
 By.ID
 By.XPATH
 By.LINK_TEXT
 By.PARTIAL_LINK_TEXT
 By.NAME
 By.TAG_NAME
 By.CLASS_NAME

Selenium等待元素

在我们进行网页操作的时候,会受网络因素影响,页面元素没有加载完毕,就进行元素查找,这时候就会报错:selenium.common.exceptions.NoSuchElementException: Message: no such element。通常情况下都是需要设置等待时间,等待页面加载完毕,再进行操作。

Selenium提供了一个解决方案,是这样的:当发现元素没有找到的时候, 并不 立即返回 找不到元素的错误。而是周期性(每隔半秒钟)重新寻找该元素,直到该元素找到,如果超出指定最大等待时长,这时才 抛出异常(如果是 find_elements 之类的方法, 则是返回空列表)。

Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait该方法接受一个参数, 用来指定 最大等待时长:

from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://baidu.com')
search=driver.find_element_by_id('kw')
search.send_keys('妹子图片')
contents=driver.find_element_by_id('1')

print(contents)

Selenium操控元素

选择到元素之后,代码会返回元素对应的 WebElement对象,通过这个对象,我们就可以 操控 元素了。
包括click点击元素呐、在元素中输入字符串(send_keys)、获取元素的文本内容(text方法)、获取元素属性(get_attribute 方法)、获取整个元素对应的HTML(get_attribute(‘outerHTML’))、获取某个元素 内部 的HTML文本内容(get_attribute(‘innerHTML’))

from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://baidu.com')
search=driver.find_element_by_id('kw') #找到搜索框
search.clear() #清空搜索框内容
search.send_keys('妹子图片') #输入"妹子图片"字符串
contents=driver.find_elements_by_class_name('result') #找到class属性为result的多个值
for content in contents:
    print(content.text)
from selenium import webdriver
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://baidu.com')
search=driver.find_element_by_id('kw') #找到搜索框
search.clear() #清空搜索框内容
search.send_keys('妹子图片') #输入"妹子图片"字符串
contents=driver.find_element_by_class_name('result') #找到class属性为result的多个值
print(contents.get_attribute('outerHTML')) #返回一个包含class属性为result的div
print(contents.get_attribute('innerHTML')) #返回class属性为result的div标签里面的内容

Selenium选择框

有的网站是选择翻页的。select框 则是一个新的select标签。 Selenium 专门提供了一个 Select类 进行操作。Select类 提供了如下的方法:

select_by_value   根据选项的 value属性值 ,选择元素。
select_by_index    根据选项的 次序 (从1开始),选择元素
select_by_visible_text   根据选项的 可见文本 ,选择元素。

deselect_by_value   根据选项的value属性值, 去除 选中元素
deselect_by_index   根据选项的次序,去除 选中元素
deselect_by_visible_text   根据选项的可见文本,去除 选中元素
deselect_all   去除 选中所有元素

Selenium模块的原理及驱动程序的下载和配置 简单的元素查找

我们面对上面的页面,就可以使用Select类来选择元素,可以参考下面的代码:

from selenium import webdriver
from selenium.webdriver.support.ui import Select
driver=webdriver.Chrome()
driver.implicitly_wait(10) # 设置最大等待时长为 10秒
driver.get('http://www.rosi999.com/x/rosi/')
select=Select(driver.find_element_by_css_selector('body > div > div.div_box > ul.cPage > li:nth-child(5) > select'))
# for i in range(110):
#     select.select_by_index(i) #采用循环翻页
select.select_by_visible_text('5') #选择页码进行翻页
select.select_by_value('list_1_8.html')#选择option标签的value属性翻页

selenium.common.exceptions.StaleElementReferenceException: Message: stale element reference: element is not attached to the page document那么你使用上面的代码翻页,会遇到前面的错误,就是点击太快,页面没有加载完成,需要加入等待。

设置phantomJS请求头中User-Agent

一般针对phantomJS的反爬虫措施都会检测User-Agent,默认的User-Agent中含有phantomJS内容,可以通过代码进行修改。代码如下:

dcap = dict(DesiredCapabilities.PHANTOMJS)
dcap["phantomjs.page.settings.userAgent"] = (
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Firefox/78.0"
)
driver = webdriver.PhantomJS()# desired_capabilities=dcap)
driver.get("https://www.e1yu.com/")
driver.quit()

移动鼠标

百度首页的右上角,有个 更多产品 选项。如果我们把鼠标放在上边,就会弹出 下面的 糯米、音乐、图片 等图标。使用 ActionChains 来 模拟鼠标移动 操作的代码如下:

from selenium.webdriver.common.action_chains import ActionChains
from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)

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

action = ActionChains(driver)

# 鼠标移动到 元素上
action.move_to_element(
    driver.find_element_by_css_selector('.s_bdbriwrapper > a:nth-child(3)')
).perform()

截屏

有的时候,我们需要把浏览器屏幕内容保存为图片文件。做自动化测试时,一个测试用例检查点发现错误,我们可以截屏为文件,以便测试结束时进行人工核查。可以使用 WebDriver 的 get_screenshot_as_file方法来截屏并保存为图片。

from selenium import  webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(5)

# 打开网站
driver.get('https://www.baidu.com/')

# 截屏保存为图片文件
driver.get_screenshot_as_file('1.png')
#或
driver.save_screenshot('1.png')

上传文件

有时候,网站操作需要上传文件。著名的在线图片压缩网站:https://tinypng.com/。通常,网站页面上传文件的功能,是通过 type 属性 为 file 的 HTML input 元素实现的。

<input type="file" multiple="multiple">

使用selenium自动化上传文件,我们只需要定位到该input元素,然后通过 send_keys 方法传入要上传的文件路径即可。

# 先定位到上传文件的 input 元素
ele = wd.find_element_by_css_selector('input[type=file]')

# 再调用 WebElement 对象的 send_keys 方法
ele.send_keys(r'h:\g02.png')

如果需要上传多个文件,可以多次调用send_keys

ele = wd.find_element_by_css_selector('input[type=file]')
ele.send_keys(r'h:\g01.png')
ele.send_keys(r'h:\g02.png')

模拟鼠标操作

模拟鼠标操作比较常用,可以解决验证码滑动,内嵌的滚动条都可以使用鼠标来模拟操作。ActionChains包

鼠标拖动操作(滑动验证码问题)

drag_and_drop(self, source, target) 

   #source:鼠标拖动的原始元素

   #target:鼠标拖动到的另外一个元素(的位置)

   拖动source元素到target元素的位置
drag_and_drop_by_offset(self, source, xoffset, yoffset)

#source:鼠标拖动的原始元素

#xoffset:鼠标把元素拖动到另外一个位置的x坐标

#yoffset:鼠标把元素拖动到另外一个位置的y坐标

拖动source元素到指定的坐标

鼠标悬浮操作

鼠标移动(悬浮)到某个元素之上:

move_to_element (element)
#element,要悬浮的元素

ActionChains的其他操作:移动鼠标、右击、双击、结合键盘按键的操作

context_click(element) #右击element元素


double_click(element)#双击element元素


move_by_offset(xoffset,yoffset)#移动鼠标到指定的x,y位置(相对于浏览器的绝对位置)


move_to_element_with_offset(element, xoffset, yoffset)#相对element元素,移动鼠标到指定的x,y位置(相对于element元素的相对位置)


click_and_hold(element1=None)   #在element1元素上按下鼠标左键,并保持按下动作(元素默认为空)


release(element2=None)#在element2元素上松开鼠标左键(元素默认为空)


key_down(key , element1=None)#在element1元素上,按下指定的键盘key(ctrl、shift等)键,并保持按下动作(元素默认为空)


key_up(key , element2=None) #在element2元素上,松开指定的键盘key(元素默认为空)


send_keys(key) #向当前定位元素发送某个key键


send_keys_to_element(element ,key) #向element元素发送某个key键

未经允许不得转载:作者:鳄鱼君, 转载或复制请以 超链接形式 并注明出处 鳄鱼君
原文地址:《Selenium模块的原理及驱动程序的下载和配置 简单的元素查找》 发布于2020-01-10

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

评论 抢沙发

7 + 3 =


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

支付宝扫一扫打赏

微信扫一扫打赏

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

登录

忘记密码 ?

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

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

注册