容器部署的selenium,如果出现以下场景:
上面的场景都会导致容器里面的driver进程没有被释放,下次再跑selenium脚本,就会报错:502超时,链接不到remote driver。
解决方法,每次跑脚本前,手动重启一下容器,但是,如果在集成工具去执行脚本,不可能每次跑脚本前都去手动重启容器。
所以,需要通过代码自动化实现这一手动操作。
import requests
import json
from helpers._redis import operate_redis
from datetime import datetime, timezone
import time
opr = operate_redis()
def redeploy_docker():
# ks登录跳转到302后,获取set-cookie
url = "http://ks.orgapp.com/login"
username = opr.find_redis_str("ks:username")
password = opr.find_redis_str("ks:password")
payload = json.dumps({"username":username,"encrypt": password})
headers = {
'content-type': "application/json"
}
# allow_redirects=False 参数表示不允许自动重定向,便会返回302,否则返回200,获取不到 set-cookie
# password = "***=@^fSn`ugM_oSgIxIW\\=G]",反斜杠被转义 \\\\,需要处理
response = requests.request("POST", url, headers=headers, data=payload.replace("\\\\","\\"), allow_redirects=False)
cookie = response.headers["Set-Cookie"]
# 重新部署docker-selenium容器
url = "http://ks.orgapp.com/apis/clusters/dev-iot4-oam/apps/v1/namespaces/devops/deployments/docker-selenium"
headers = {
'cookie': cookie,
# 这里需要看前端的传值,有些不一样
'content-type': "application/merge-patch+json"
}
# 获取当前时间
current_time = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
payload = {"spec":{"template":{"metadata":{"annotations":{"kubesphere.io/restartedAt": str(current_time)}}}}}
response = requests.request("PATCH", url, json=payload, headers=headers)
# 等待容器重启
time.sleep(10)
if __name__ == "__main__":
redeploy_docker()
三、运行顺序
试过在scrapy框架里面调用 重启ks容器自动化的脚本,可还是经常出现连接remote-selenium超时的情况,猜测还是因为重启ks容器自动化的顺序不能在scrapy创建driver对象之前。
所以,简单粗暴些,在Jenkins的shell命令行里面,先直接执行ks的文件,再运行scrapy: