Selenium是一个自动化测试工具,利用它我们可以驱动浏览器执行特定的动作,如点击、下拉等操作。
本文将从环境部署到项目开发一步步讲解,包括这个过程所可能遇到的一些问题,都会一一解答,有不会的问题可以在下方评论留言一起思考解决。
一.环境部署
环境部署包括mac和linux
1.安装Selenium
pip3 install selenium
这里推荐大家使用Anaconda管理python包及环境,Anaconda是一个方便的python包管理和环境管理软件,一般用来配置不同的项目环境。如果你的电脑只能安装一个环境,而两个项目却用着不同的环境,那么你可以使用Anaconda创建多个互不干扰的环境,分别运行不同版本的软件包,以达到兼容的目的。
Anaconda通过管理工具包、开发环境、Python版本,大大简化了你的工作流程。不仅可以方便地安装、更新、卸载工具包,而且安装时能自动安装相应的依赖包,同时还能使用不同的虚拟环境隔离不同要求的项目。
Anaconda的安装流程及使用
https://blog.csdn.net/qq_42184296/article/details/103063955
2.安装ChromeDriver
2.1.查看浏览器版本
2.2.在浏览器的帮助/关于Google Chrome 查看浏览器版本
2.3.下载相应的ChromeDriver(两种方法)
方法一 :
- 打开ChromeDriver官方网站,根据上面的浏览器版本,下载相应版本的ChromeDriver
- 将解压好的文件放入/usr/local/bin目录中,由于mac的很多目录都是隐藏的,所以我们按快捷键command+shift+g,在弹出的窗口输入/usr/local/bin,就可以打开这个目录,接着将解压好的驱动放入此目录即可。
- 进行测试(在终端输入: chromedriver --version,可以查看到版本)
方法二 :
- 安装brew及使用可能遇到的问题
https://www.cnblogs.com/trotl/p/11862796.html
- 下载chromedriver
通过命令brew cask install chromedriver去下载
- 测试
在终端输入: chromedriver --version,可以查看到版本
3.安装识别验证码的包
- 用homebrew 在电脑上安装tesseract库
brew install tesseract
- 用pip安装支持python的tesseract
pip install pytesseract
- 如果是识别中文
去往https://github.com/tesseract-ocr/tessdata下载中文数据集chi_sim.traineddata,把它放到这目录下:
/usr/local/Cellar/tesseract/3.05.01/share/tessdata
4 .安装容易遇到的问题:
- 提示brew update,代表homebrew需要更新
- 提示must be writable!或者Permission denied之类问题,试试前面加sudo
- 提示Please check the permissions and owner of that directory,说明权限有问题,那么使用sudo chown root 文件路径命令获得临时root权限
- 提示Xcode alone is not sufficient on Sierra,使用xcode-select --install
二.实现逻辑
开始想的逻辑是,获取到验证码的地址,然后爬取下来并请求,下载验证码图片并识别再填上去,发现这样行不通,每次请求获得的验证码图片不一致,这得从会话角度去解决问题。这里我换了种思维更简单的去解决这个问题,通过截图的方式把页面上的验证码截图下来保存为图片并识别出文字。
1. 实现中所遇到的问题
-
chromedriver的截图只能截取当前页面的图片,不能得到整个页面的图片,这样就不能通过定位验证码图片的位置去截取验证码图片,对于页面有滑动的只能手动调试位置。
-
处理验证码失败的提示框
-
当从a页面跳转到b网页,然后获取b页面的某个元素时,容易出错。因为代码执行速度比网页加载速度快,通常会出现无法找到该元素的错误。遇到无法找到页面元素的情况,要考虑是否是代码加载过快的原因,处理方法:在获取元素前➕time.sleep(2)
-
快速获取元素路径的方式:网页->检查->选中对应标签->右键选择copy->copy xpath
2. 用到的一些方法
2.1 处理Windows弹出框(三种情况)
使用 driver.switch_to.alert 切换到Windows弹出框
Alert类提供了一系列操作方法:
accept() 确定
dismiss() 取消
text() 获取弹出框里面的内容
send_keys(keysToSend) 输入字符串
1.定位alert弹出框
#点击页面元素,触发alert弹出框
driver.find_element_by_xpath('//*[@id="alert"]').click()
time.sleep(3)
#等待alert弹出框可见
WebDriverWait(driver,20).until(EC.alert_is_present())
#从html页面切换到alert弹框
alert = driver.switch_to.alert
#获取alert的文本内容
print(alert.text)
#接受--选择“确定”
alert.accept()
2.定位confirm弹出框
driver.find_element_by_xpath('//*[@id="confirm"]').click()
time.sleep(3)
WebDriverWait(driver,20).until(EC.alert_is_present())
alert =driver.switch_to.alert
print(alert.text)
# 接受--选择“取消”
alert.dismiss()
3.定位prompt弹出框
driver.find_element_by_id("prompt").click()
time.sleep(3)
WebDriverWait(driver,20).until(EC.alert_is_present())
alert =driver.switch_to.alert
alert.send_keys("jaja")
time.sleep(5)
print(alert.text)
# alert.dismiss()
alert.accept()
2.2 python+selenium调用js方法
from selenium import webdriver
js = '''var str="联想词:%s===>车系:%s";window.alert(str);''' % (alias, name)
driver.execute_script(js)
execute_script(js)和execute_async_script(js)分别是是同步和异步方法,前者会等待js代码执行完毕后主线程执行,后者它不会阻塞主线程执行。
execute_script(js) 方法如果有返回值,有以下几种情况:
* 如果返回一个页面元素(document element), 这个方法就会返回一个WebElement
* 如果返回浮点数字,这个方法就返回一个double类型的数字
* 返回非浮点数字,方法返回Long类型数字
* 返回boolean类型,方法返回Boolean类型
* 如果返回一个数组,方法会返回一个List
* 其他情况,返回一个字符串
* 如果没有返回值,此方法就会返回null
2.3 selenium+python的常用方法
1.创建webdriver对象
browser=webdriver.Chrome()
2.打开百度页面
browser.get('https://www.baidu.com')
3