最近因为一个需求,着手开发一款使用selenium+requests进行多线程的测试工具,当然还是基于相对熟悉的python来开发。由于很久没写了,就有很多道理我都懂,一试就出错的问题,前前后后折腾了几天总算是开发完了,这里就把期间遇到的问题做一个记录,希望可以帮助到有同样困惑的同学。
一、服务器端环境配置
1. Ubuntu 20.04配置安装python 3.10并修复pip
这个其实内容不是很难,但无奈网上教程抄来抄去,没有一个真正讲清楚的,在参考了几个教程以及实际测试后,整理操作如下: 目前ubuntu 20.04默认的python版本是3.8,所以我们需要先给系统安装3.10,然后再设置默认python并修复对应的pip,这里参考了这篇文章:在Ubuntu20.04上安装Python3.10以及pip,为了方便我就把命令都直接贴出来,经过实际测试是没有问题的。
apt install software-properties-commonsudo add-apt-repository ppa:deadsnakes/ppaapt update
apt install python3.10
ls -l /usr/bin/python*
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 1
update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2
update-alternatives --config python3
apt install python3.10-distutils
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.pypython3 get-pip.py
python3 get-pip.py --user
pip3 -V
2. ubuntu 20.04安装chrome浏览器和webdriver
使用selenium需要使用和浏览器对应版本的webdriver,这里我们使用chrome。
apt update
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
apt install ./google-chrome-stable_current_amd64.deb
google-chrome -version
下载chromedriver,官方目录链接chromedriver
二 、关于selenium的一些启动参数的说明
1. 无窗口模式
options.add_argument('--headless')
2. 隐身模式
options.add_argument("--incognito")
3. 无沙箱模式
options.add_argument("--incognito")
4. 页面加载策略
options.page_load_strategy = 'eager'
5. 忽略证书不可信的
options.add_argument('--ignore-certificate-errors')
6. 关于加载等待
options.add_argument('xxxxxxxx')
driver = webdriver.Chrome(chrome_options=options, executable_path=chrome_driver)
driver.set_page_load_timeout(25)
driver.get("http://xxxxxxxxxxxxxx")
7. 当打开页面遇上alert框
try:
driver.switch_to.alert.accept()
except:
pass
8. 关于selenium使用http还是https
for protocolType in ["http://", "https://"]*3:
driver.get(protocolType + url.strip())
9. 关于判断网页是否打开
driver.title
这里我用了一个判断的办法就是,在加载页面前设置一个启动时间,结束设置一个结束时间,如果有标题或者是加载时间在设置的加载超时时间内,就算是可以打开,虽然不是很严谨,但是误差相对来说小很多,附上简单逻辑代码供参考。
for protocolType in ["http://", "https://"]*3:
start_time = datetime.datetime.now().timestamp()
try:
driver.get(protocolType + url.strip())
try:
driver.switch_to.alert.accept()
except:
pass
end_time = datetime.datetime.now().timestamp()
if driver.title or end_time - start_time < 23:
print("打开成功")
break
else:
print("打开失败")
except Exception as e:
print("打开失败")
time.sleep(2)
driver.quit()
三、关于测试的时候到底是http还是https
在测试过程中无论是requests还是selenium都面临着同一个问题,就是如何判断网站使用的是http还是https,在实际开发过程中,几乎没有找到一种通用方法可以百分百覆盖的成功判断并打开所有网站,最后我用的策略就是,把所有的情况都试一遍。然后做一个计数器,成功打开加一,否则不加,最后计数不为0即为可以打开,虽然看起来有些啰嗦,但是在网络环境稳定的情况下效果还不错。
requests_method = [request_method.http_head,request_method.https_head,request_method.http_get, request_method.https_get]
success_hit = 0
fail_hit = 0
if r.status_code in success_code:
success_hit += 1
elif r.status_code in fail_code:
fail_hit += 1
|