Selenium + C#复用已经打开的网页


前言

近期做一个小项目,需要用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是如何启动浏览器的

扫描二维码关注公众号,回复: 16208310 查看本文章

还有一个办法就是在VS 调试时的变量里查看:
在这里插入图片描述
其实Session ID 也能在这里查到。
查到后记下来就行了。

(2) 在以后的调试中复用已经打开的网页。
利用打开的网页,新建的driver 类型就不能是ChromeDriver或是IWebDriver, 而必须是RemoteWebDriver (当然实例化后可以强制转为IwebDriver)

Uri remoteAddress = new Uri("http://127.0.0.1:61924");
//String sessionId = "3477a25b0f77093da10155241aab4bae";
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#了解不多,所以只能先用这个笨办法凑合,希望有高手指点。

猜你喜欢

转载自blog.csdn.net/m0_54284125/article/details/122635412
今日推荐