day4 selenium的使用

selenium

Selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Perl等不同语言的测试脚本。



day4 selenium的使用

Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接调用浏览器,它支持所有主流的浏览器(包括PhantomJS这些无界面的浏览器),可以接收指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏等。我们可以使用selenium很容易完成之前编写的爬虫。
安装:pip/pip3 install selenium
下载版本符合的webdriver:找到对应的Microsoft Edge浏览器版本号,下载压缩包解压得到可执行文件,对其配置环境变量。webdriver下载地址
https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
在这里插入图片描述

import  time
from selenium import webdriver

# 通过指定chromedriver的路径来实例化driver对象,chromedriver放在当前目录。
# driver = webdriver.Chrome(executable_path='./chromedriver')
# chromedriver已经添加环境变量
driver = webdriver.Edge()
driver.get("http://www.baidu.com")

# 在百度搜索框中搜索'python'
driver.find_element_by_id('kw').send_keys('python')

# 点击百度搜索
driver.find_element_by_id('su').click()

time.sleep(5)
# 退出
driver.quit()

  • webdriver.Chrome(executable_path='./chromedriver')中executable参数指定的是下载好的chromedriver文件的路径
  • driver.find_element_by_id('kw').send_keys('python')定位id属性值是’kw’的标签,并向其中输入字符串’python’
  • driver.find_element_by_id('su').click()定位id属性值是su的标签,并点击
    click函数作用是:触发标签的js的click事件

driver常用属性

from selenium import webdriver

url = 'http://www.baidu.com'

driver = webdriver.Edge()
driver.get(url)

# 当前标签页浏览器渲染之后的网页源代码
print(driver.page_source)

#当前标签页的ur
print(driver.current_url)

# 关闭当前标签
driver.close()

# 当get新的网页时,此属性可以实现网页前进,back()可以实现回退当前一个页面
print(driver.forward())

# 页面截图 一般用于获取网页图片分析
driver.screen_shot("images.png")

# 关闭浏览器
driver.quit()

driver对象定位标签元素获取标签对象的方法

find_element_by_id (返回一个元素)
find_element(s)_by_class_name (根据类名获取元素列表)
find_element(s)_by_name (根据标签的name属性值返回包含标签对象元素的列表)
find_element(s)_by_xpath (返回一个包含元素的列表)
find_element(s)_by_link_text (根据连接文本获取元素列表)
find_element(s)_by_partial_link_text (根据链接包含的文本获取元素列表)
find_element(s)_by_tag_name (根据标签名获取元素列表)
find_element(s)_by_css_selector (根据css选择器来获取元素列表)

注意:

  • find_element和find_elements的区别:

    • 多了个s就返回列表,没有s就返回匹配到的第一个标签对象
    • find_element匹配不到就抛出异常,find_elements匹配不到就返回空列表
  • by_link_text和by_partial_link_tex的区别:全部文本和包含某个文本

  • 以上函数的使用方法

    • driver.find_element_by_id('id')

    标签对象提取文本内容和属性值

find_element仅仅能够获取元素,不能够直接获取其中的数据,如果需要获取数据需要使用以下方法:
点击 element.clock()
输入框输入内容: element.send_keys(data)
获取文本:element.text
获取属性值element.get_attribute("属性名")

以获取五八同城某一页面用户名为例:

from selenium import  webdriver

url = 'https://cd.58.com/danche/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-0006-6e3d-a96c-6d872bd843fd&ClickID=2'
driver  = webdriver.Edge()

driver.get(url)

text_list = driver.find_elements_by_xpath('//tbody/tr/td[2]/a[1]/div[1]')
i = 0
while i<len(text_list):
    print(text_list[i].text)
    i = i+1

selenium的其他用法

selenium标签页的切换

当selenium控制浏览器打开多个标签页时,如何控制浏览器在不同的标签页中进行切换
1.获取所有标签页的窗口句柄
2.利用窗口句柄字切换到句柄指向的标签页
具体方法

在这里插入代码片

实例化代码

from selenium import webdriver
import time #sleep
# 目标访问地址
url = 'https://cd.58.com/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT'

# 实例化浏览器webdriver对象
driver = webdriver.Edge()
# 获取连接
driver.get(url)
time.sleep(2)

# 打印当前句柄
current_windows = driver.window_handles
print(current_windows)

# 获取当前网络元素 执行点击操作
element = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div[1]/div/div[1]/div[1]/span[1]/a').click()

# 获取当前窗口句柄
current_windows = driver.window_handles
print(current_windows)

# 句柄切换
driver.switch_to.window(current_windows[-1])
# 定位新元素
elements = driver.find_elements_by_xpath('/html/body/div[6]/div[2]/ul/li/div[2]/h2/a')
print(elements)

time.sleep(5)
driver.close()



句柄如果不切换运行结果
成功运行截图

switch_to切换frame标签

iframe是html中常用的一种技术,即一个页面中嵌套了另一个网页,selenium默认是访问不了frame中的内容的,对应的解决思路是driver.switch_to.frame(frame_element)

import time
from selenium import webdriver

driver = webdriver.Chrome()

url = 'https://mail.qq.com/cgi-bin/loginpage'
driver.get(url)
time.sleep(2)

login_frame = driver.find_element_by_id('login_frame') # 根据id定位 frame元素
driver.switch_to.frame(login_frame) # 转向到该frame中

driver.find_element_by_xpath('//*[@id="u"]').send_keys('1596930226@qq.com')
time.sleep(2)

driver.find_element_by_xpath('//*[@id="p"]').send_keys('hahamimashicuode')
time.sleep(2)

driver.find_element_by_xpath('//*[@id="login_button"]').click()
time.sleep(2)

"""操作frame外边的元素需要切换出去"""
windows = driver.window_handles
driver.switch_to.window(windows[0])

content = driver.find_element_by_class_name('login_pictures_title').text
print(content)

driver.quit()

selenium对cookie的处理

selenium能够帮助我们处理页面中的cookie,比如获取、删除,driver.get_cookies()返回列表,其中包含的是完整的cookie信息!不光有name、value,还有domain等cookie其他维度的信息。所以如果想要把获取的cookie信息和requests模块配合使用的话,需要转换为name、value作为键值对的cookie字典。

# 获取当前标签页的全部cookie信息
print(driver.get_cookies())
# 把cookie转化为字典
cookies_dict = {cookie['name']: cookie['value'] for cookie in driver.get_cookies()}

删除cookie

#删除一条cookie
driver.delete_cookie("CookieName")

# 删除所有的cookie
driver.delete_all_cookies()

selenium控制浏览器执行js代码

import time
from selenium import webdriver
# 如果元素没有出现在当前视野中,则要操作鼠标让页面下拉。否则将会报错

driver = webdriver.Edge()
driver.get("http://baidu.com)
time.sleep(1)

# scrollTo(x,y) 一般现在浏览器为宽屏浏览器,不用设置具体值。 document.body.scrollHeight
js = 'window.scrollTo(0,document.body.scrollHeight)' 

# 执行js
driver.execute_script(js)

time.sleep(5)
driver.quit()

页面等待

页面在加载的过程中需要花费时间等待网站服务器的响应,在这个过程中标签元素有可能还没有加载出来,页面等待来解决这个问题。
具体分类

  1. 强制等待:time.sleep()
  2. 隐式等待:隐式等待针对的是元素定位,隐式等待设置了一个时间,在一段时间内判断元素是否定位成功,如果完成了,就进行下一步;在设置的时间没有完成定位成功,就会超时报错。
**from selenium import webdriver

driver = webdriver.Chrome()  

driver.implicitly_wait(10) # 隐式等待,最长等20秒  

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

driver.find_element_by_xpath()**
  1. 显式等待:每经过多少秒就查看一次等待条件是否达成,如果达成就停止等待,继续执行后续代码;没有完成等待,直到超过了规定时间,就会报错。
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')

# 显式等待
WebDriverWait(driver, 20, 0.5).until(
    EC.presence_of_element_located((By.LINK_TEXT, '好123')))  
# 参数20表示最长等待20秒
# 参数0.5表示0.5秒检查一次规定的标签是否存在
# EC.presence_of_element_located((By.LINK_TEXT, '好123')) 表示通过链接文本内容定位标签
# 每0.5秒一次检查,通过链接文本内容定位标签是否存在,如果存在就向下继续执行;如果不存在,直到20秒上限就抛出异常

print(driver.find_element_by_link_text('好123').get_attribute('href'))
driver.quit() 

selenium开启无界面模式

绝大多数服务器是没有界面的,selenium控制浏览器也是存在无界面模式的,这一小节我们就来学习如何开启无界面模式(又称之为无头模式)
开启无界面模式的方法:

import time

from selenium import webdriver

# 创建一个配置对象
options = webdriver.EdgeOptions()

# 开启无界模式
options.add_argument("--headerss")
# 禁止使用gpu
options.add_argument('--disable-gpu')

# 实例化带参数的driver对象
driver  = webdriver.Edge(options=options)

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

print(driver.title)
time.sleep(30)
driver.quit()

selenuim使用代理ip

selenium控制浏览器也是可以使用代理ip的!

from selenium import webdriver

# 创建一个配置对象
options = webdriver.EdgeOptions()

# 使用代理i
options.add_argument('--proxy-server=http://180.120.182.149:9999')

# 实例化带有配置的driver对象
driver = webdriver.Edge(options=options)

driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()

selenium替换user-agent

from selenium import webdriver

options = webdriver.EdguOptions() # 创建一个配置对象
options.add_argument('--user-agent=Mozilla/5.0 HAHA') # 替换User-Agent

driver = webdriver.Edgu(options=options)

driver.get('http://www.itcast.cn')
print(driver.title)
driver.quit()



___ 2022.04.14

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Warm wolf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值