Selenium WebDriver实现两个程序操作同一个浏览器即操作之前已经打开的浏览器

本文介绍如何在Selenium WebDriver中实现一个自动化测试用例操作另一个用例已打开的浏览器。通过理解Selenium的server-client架构和sessionid的工作方式,作者展示了如何使用Python发送HTTP请求来控制已存在的浏览器窗口,并提供了代码改进方案,避免频繁查找文档和创建新会话。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

在使用Selenium WebDriver实现web自动化测试的过程中,有一个场景:需要在一个自动化用例中,操作其他用例已经打开的浏览器即接着上一个用例的操作,继续执行。

简述原理

Selenium Webdriver是使用server-client结构实现的,server端使用浏览器驱动程序来启动浏览器并且创建一个命令执行器,client端实现一个http的客户端与命令执行器通信,将按照selenium定义的格式的http请求和参数发送给命令执行器,命令执行器识别这些命令后对浏览器进行操作,而server的命令执行器和client之间的通信凭证就是sessionid

实现

使用python

from selenium import webdriver


driver = webdriver.Chrome()

print driver.command_exector._url
print driver.session_id

执行后,输出

http://127.0.0.1:23417             // 命令执行器的url
fe6fda53626f08b1cde42e76f05f47     // session id

此时,可以看到已经打开了一个浏览器,且我们的程序已经执行结束了。
接下来,在这个已经打开的浏览器里,打开 百度 的首页,使用postman 发送post请求
url: http://127.0.0.1:23417/session/fe6fda53626f08b1cde42e76f05f47/url
body json/application

{
   "url":"https://www.baidu.com"
}

发送请求后,可以看到在之前打开的浏览器上,已经打开了百度的首页。
至于别的操作,可以查看文档来发送对应的请求。
参考:https://www.w3.org/TR/webdriver/

改进

上面的方式,要求我们去查询文档,来发送相应请求来实现相应目的。这样工作量太大,太繁琐,不易维护。接下来我们从编码上直接去实现。

假设:已知 executor_url = “http://127.0.0.1:23417”
session_id = “fe6fda53626f08b1cde42e76f05f47”

使用python

from selenium import webdriver
​
executor = "http://127.0.0.1:23417"
session_id = "fe6fda53626f08b1cde42e76f05f47"
​
driver = webdriver.Remote(command_executor=executor , desired_capabilities={})
​
driver.session_id = session_id
​
print driver.current_url

执行之后,有的版本可以实现,有何版本能够重新连接上一个会话,但却打开了一个新的空白会话。
查看Remote类的源码,发现每次实例化都会调用start_session这个方法新建一个会话。

解决方法:集成并重现这个类,自定义一个ReuseChrome这个类重写start_session方法使它不再新建session,使用传入的session_id

from selenium.webdriver import Remote
from selenium.webdriver.chrome import options
from selenium.common.exceptions import InvalidArgumentException
​
class ReuseChrome(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, capabilities, browser_profile=None):
       """
      重写start_session方法
      """
       if not isinstance(capabilities, dict):
           raise InvalidArgumentException("Capabilities must be a dictionary")
       if browser_profile:
           if "moz:firefoxOptions" in capabilities:
               capabilities["moz:firefoxOptions"]["profile"] = browser_profile.encoded
           else:
               capabilities.update({'firefox_profile': browser_profile.encoded})
​
       self.capabilities = options.Options().to_capabilities()
       self.session_id = self.r_session_id
       self.w3c = False
import ReuseChrome
​
driver = ReuseChrome(command_executor=executor_url, session_id=session_id)print(driver.current_url)

成功了!

.确认(verifation)和断言(assert)有什么区别? 确认:当测试中的一个存在错误时,系统将会继续运行这些测试 断言:当测试中的一个存在错误时,系统将会退出当前用 总而言之,确认和断言的不同在于,当出现错误情况之后,系统将会如何处理。 .test case 和testsuite的区别? test case是一个 test suite是一组用 7.selenium IDE, selenium core, selenium core hta, selenium rc四者的概念以及它们之间的区别? selenium IDE(集成开发环境)。它是一个firefox的插件,可以录制、回放并编辑测试脚本 selenium Core(核心)。这是符合断言机制,由测试套件执行的平台。它是整个测试机制的核心部分,由纯javaScript代码组成 selenium Core Hta.这是针对IE设计的执行平台,运行于IE的最高字全级别之上。 selenium Remote Control(远程控制):它是一个代理与控制端,可代替selenium core/selenium DIE的客户端,并支持多语言 8.能不能在IE中录制脚本吗? 不能,只能在firefox中安装selenium IDE,而只有selenium IDE才存在录制的功能。 如果想测试一些,不能在firefox中正常显示的程序,则只有安装selenium RC,然后自己编写测试脚本,只有这样,脚本才能在ie中运行。 12.怎样安装多窗口模型? (1)启动selenium-server时,输入以下的命令:java-jar selenium-server.jar -multiwindow。则会在两个窗口中显示运行结果 (2)启动selenium-server时,输入以下的命令:java -jar selenium-server.jar -singlewindow。则会在一个窗口中显示运行结果 15.怎样访问变量? ${变量名} 16.在录制的过程中,遇到了提示框的话,要怎样处理才能在正常的回放? 17.录制到邮件的时候,不能正常录制,要如何处理呢? 录制的时候,首先要指定要框架,然后再输入文本。 如:邮件通过firebug定位为: 在selenium ide中则需要手动的输入以下的内容: 再输入一条以下的命令:selectFrame relative=top 则,此时的脚本就能正常的运行了。 18.录制到组件的时候,不能正常录制,要怎样处理? 如:上传附件(以及其它一些要上传的东西),刚发现附件并不是不能录制,而是你在界面中的定位不是很清楚,selenium不能识别。 19.录制时,会跳出多个窗口,此时要怎样处理? 存在四种解决方法,可以参考http://www.boobooke.com/bbs/viewthread.php?tid=41824&highlight=selenium中的第七集 具体方法如下:(1)java中可用如下的代码:String[] titles =selenium.getAllWindowTitles(); //得到所有窗口的标题 selenium.selectWindow("title="+titles[titles.length-1]); //选择最后打开一个窗口 selenium.close(); //关闭最后打开一个窗口 selenium.selectWindow("null"); //重新聚集在最开始的一个窗口(只有两个窗口的时候) (2)java中可用如下的代码:selenium.click("link=????"); 换成如下的两行代码 String url = selenium.getAttribute(link=????@href); selenium.open(url); 注:此方法也存在一定的缺陷,就是不能验证click点击事件是否正确。 (3)利用javascript去掉原代码中的target="_blank"的属性(目前为止还不清楚) (4)这种方法不清楚,看的不是很懂 20.什么是window id? window id可以通过java中。selenium.getAllWindowId()方法得到,不过一般情况下都是undefined 22.selectFrame中的relative=up,relative=top,relative=parent等等,是什么意思?它们之间存在怎样的关系? 23.select,selectFrame,selectWindow,selectPopUp,这几个功能的用法,以及在什么时候用? select用来操作下拉框。语法:select(selectLocator,optionLocator) ,:select id=person_person_type,lable=非户籍人口 selectFrame用来操作iframe框架。语法:selectFrame(location) ,: select xpath =//iframe[@name='abc'] selectWindow用来操作多个窗口问题,至于如何操作可参考上面的19条的描述。 selectPopUp:这种情况还没有遇到。 24.selectWindow 中的windowID怎样定位呢? (1)title:就是一个window标题栏中的文本。 (2)name::软件测试论坛,则selectWindow name='selenium_blank60273' (3)var 25.录制完成之后,经常会出现回放不成功的情况,在这种情况之下要如何处理呢? (1)看是否要加上wait,很多的时候,只要你加上wait之后,回放就能正常运行了,如:原本为click,会报错,修改为clickAndWait之后,系统就能正常回放 (2)判断出错的地方,此地方是不是因为框架没有选对呢。如:原本的框架为frame1,现在执行的操作在frame2时,此时要怎样处理? 加上以下两条语句:selectFrame. relative=up, selectFrame. frame2Locator; 26.selenium ide不能录制的东西? (1)html5中部分元素不能录制 (2)上传文件控件不能录制 (3)用于绘图、图像编辑、文档设计、演示和web图形设计的集成应用软件不能录制 (4)silverlight flex and flash不能录制 27.[warn] Link has target '_blank', which is not supported in Selenium!这个问题的原因?(可参考上文中的19) Link has target '_blank'这个好像是这样的:当Link有这个属性时,会打开浏览器窗口,如果target是"_blank"的话,Selenium不能找到打开的新窗 口,如果target有一个明确的名字的话,selenium就能够找到这个打开的新窗口并在其上进行操作了。 "_blank"的话,selenium不能保证一定找到找准这个窗口,所以给出警告,如果只有这样的一个窗口和主窗口,selenium通过一些变通的方法也能找到该窗 口,但是不保证。 这是selenium本身限制的问题,暂时不晓得怎么解决,只要不影响测试就不用管这个警告。 "selenium_blank4795 "这个应该是OpenQA里提给selenium的bug号吧? 28.可以直接在DOS环境下,在打开selenium-server.jar的解压目录的情况下,可以输入以下命令java -jar selenium-server.jar -singlewindow -htmlsuite *iexpolre http://www.baidu.com"C:\Documents and Settings\zhuhui\桌面\testcase1" "C:\Documents and Settings\zhuhui\桌面 \result.html"时,系统会报错? 对于这 个问题的解决方法,可参考http://bbs.51testing.com/thread-302909-1-1.html。由于要修改原码,所以我暂时还没有看。 29.com.thoughtworks.selenium.SeleniumException: XHR ERROR: URL =http://192.168.1.15:3000/login Response_Code = 500 Error_Message = InternalServerError的原因是什么? 注: 1.pop-up blocker的意思是:弹出窗口屏蔽(阻止未经许可弹出的窗口出现) 2.选择一个框架之后,以后的命令都会在这个框架中,要想操作其它的框架,则必须要选择相应的框架才能进行相关的操作。 3.目前在测试中,还没有遇到多个window之间转换的情况。现在只遇到多个frame转换的情况。 .java语言存在几种测试框架? 目前为止,java语言存在两种测试框架:JUnit,testNG 怎样在多窗口中运行程序 (1)启动selenium-server时,输入以下的命令:java -jar selenium-server.jar -multiwindow。则会在两个窗口中显示运行结果 (2)启动selenium-server时,输入以下的命令:java -jar selenium-server.jar -singlewindow。则会在一个窗口中显示运行结果
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值