前言
近期做一个小项目,需要用Selenium做网页自动化。原型已经用Python写好,但是考虑到用户是小白中的小白,还是用C#发布成可执行文件比较合适 (Python打包的可执行文件在公司环境下会被杀毒软件拦截). 调试时比较难受,因为工作网页登录过程比较烦琐,因此迫切希望能够利用已经打开的网页
提示:以下是本篇文章正文内容,下面案例可供参考
一、Python中是轻而易举的事
在Python中复用已打开的网页很简单。 (1) 第一次打开网页时,记下command executor url 和 session id
chrome_options = Options()
prefs = {}
prefs['profile.default_content_settings.popups']=0
prefs['download.default_directory']= r'C:\temp'
chrome_driver = r"C:\SeleniumWebDriver\Chrome_96\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver, options = chrome_options)
executor_url = driver.command_executor._url
session_id = driver.session_id
hd_main = driver.current_window_handle
把这3个变量print出来,记下来。 (2) 后续调试时, 改用以下代码
executor_url = 'http://127.0.0.1:55747'
session_id = '31a48d06e87e44479d69651f69e4316d'
hd_main = 'CDwindow-9A560A8A939BC99CE24C3222A5702455'
# 以上3个变量值就是第一次打开时取得的
driver = webdriver.Remote(command_executor=executor_url, desired_capabilities={})
driver.session_id = session_id
driver.switch_to.window(hd_main)
用这个办法,虽然会有一个空白网页出来,但是不影响,直接关掉新出来的空白网页就可以了。
二、C#中难度大很多(还没找到好办法)
1.网上提供的方法,在Selenium 4.1.0下实测行不通
https://tarunlalwani.com/post/reusing-existing-browser-session-selenium-csharp/
主要问题是SessionID 无论什么办法都写不进去。
2.一个凑合的办法
(1)还是要取得executor url 和 SessionID SessionID 比较简单:
var driver = new ChromeDriver(chrome_driver);
var session_id = remoteDriver.SessionId;
但是url 就比较复杂。用上面网上提供办法也行不通。不过好在Chrome WebDriver启动时会提供: 【注意,WebDriver会给出两个端口号, 要取的是第一个. 关于其原理,请参见如下文章:> selenium是如何启动浏览器的 】
还有一个办法就是在VS 调试时的变量里查看: 其实Session ID 也能在这里查到。 查到后记下来就行了。
(2) 在以后的调试中复用已经打开的网页。 利用打开的网页,新建的driver 类型就不能是ChromeDriver或是IWebDriver, 而必须是RemoteWebDriver (当然实例化后可以强制转为IwebDriver)
Uri remoteAddress = new Uri("http://127.0.0.1:61924");
ICapabilities capability = chrome_options.ToCapabilities();
var remoteDriver = new RemoteWebDriver( remoteAddress, capability);
这里利用了RemoteWebDriver()实例化时可以指定remoteAddress的功能。 但是我还是没找到方法把SessionID用代码设置的方法。 有一个笨办法,同样是在VS 的变量清单中找到driver, 然后找到SessionID, 强行改掉它就可以了。 这个办法也会新开一个空窗口,关掉它就行(实际上新开了一个session)
总结
问题的关键是C#的Selenium中,excutor url 和 SessionID都是private 变量,而且SessionID是只读的,所以造成了困难。 因为对C#了解不多,所以只能先用这个笨办法凑合,希望有高手指点。
|