、基本原理

       在一个未关闭的会话前提下,通过重写senlium中start_seeion(),将重新打开新会话思路改成连接上指定的已有的会话。

、运用场景

        因为Webdriver每次实例化都会新开一个全新的浏览器会话,在有些情况下需要复用之前打开未关闭的会话。比如爬虫,希望结束脚本时,让浏览器处于空闲状态。当脚本重新运行时,它将继续使用这个会话工作。还就是在做自动化测试时,前面做了一大推操作,但是由于程序出错,重启时不用再继续前面复杂的操作。

三、操作步骤

第一步:使用senlium,通过调用webdriver,驱动浏览器,并打开指定网址,并获取session_id和command_executor._url

(以chromedriver为例,url=https://www.baidu.com,其他浏览器也一样的,注意驱动版本和浏览器版本对应就行):

py脚本如下:

from selenium import webdriver
driver=webdriver.Chrome(executable_path=r"C:\KFSofts\AutoFrameWork\chromedriver.exe")
print driver.session_id
print driver.command_executor._url
driver.get("https://www.baidu.com/l")
driver.maximize_window()
print driver.session_id
print driver.command_executor._url

执行以上代码,如果如下:

第二步操作:重新senlium中start_seeion()方法,并将第一步获取到session_id和executor_url,实现重新建立会话,代码如下:

#-*- coding:utf-8 -*-
from selenium.webdriver import Remote
from selenium.webdriver.chrome import options

class ReuseBrowser(Remote):

    def __init__(self, command_executor, session_id):
        self.r_session_id = session_id
        Remote.__init__(self, command_executor=command_executor, desired_capabilities={})

    def start_session(self, desired_capabilities, browser_profile=None):
        capabilities = {'desiredCapabilities': {}, 'requiredCapabilities': {}}
        for k, v in desired_capabilities.items():
            if k not in ('desiredCapabilities', 'requiredCapabilities'):
                capabilities['desiredCapabilities'][k] = v
            else:
                capabilities[k].update(v)
        if browser_profile:
            capabilities['desiredCapabilities']['firefox_profile'] = browser_profile.encoded

        self.w3c = "specificationLevel" in self.capabilities
        self.capabilities = options.Options().to_capabilities()
        self.session_id = self.r_session_id
        self.w3c = False
if __name__=="__main__":
    driver=ReuseBrowser("http://127.0.0.1:50912","bc22da4a63675db92e5ad000efb51c35")
    driver.maximize_window()
    driver.find_element_by_id("kw").send_keys("驱动自动化")
    driver.find_element_by_id("su").click()

基于以上实现,下一步是实现和自动化测试框架和senlium2library库的结合。

Logo

一站式 AI 云服务平台

更多推荐