SeleniumWebdriver重新使⽤已打开的浏览器实例
我弄这个的本意是为了在SoapUI中更好地编写⾃动化⽤例,因为我的业务流程有的很长,有7-8个页⾯。
我想把代码不集中在⼀个Groovy 脚本⾥,想在第⼆个脚本中继续使⽤第⼀个脚本中打开的浏览器。这样便于
维护和定位问题。
也还有⼀种情况是我打开了浏览器,,操作了系统到某⼀个界⾯后,我写了这个页⾯的测试脚本,使⽤已
打开的浏览器我⽴刻就可以单独对这个页⾯进⾏测试,测试我写的代码是否OK 。不通过就⼈⼯操作复位页⾯,
修改代码后再次测试,不⽤每次测试代码是否可⾏都从头打卡浏览器,登录系统,重新操作了。可以实现分步
单页⾯调试⾃动化脚本。
new FirefoxDriver()时,启动Firefox浏览器时,带此插件⼀起启动,然后插件会默认监听7055端⼝,7055被占⽤就使⽤下⼀个端⼝。如下图所⽰。
同⼀台机器上可以同时启动多个FirefoxDriver实例,每个实例占⽤不同的端⼝号。
The WebDriver Wire Protocol 协议的具体内容请看:le/p/selenium/wiki/JsonWireProtocol#Introduction。这个协议现在正在被W3C标准化,W3C Webdriver,两者基本⼀样。
W3C Webdriver标准协议内容:/TR/webdriver/
(2)WebdriverServer接收到Http Request之后,根据不同的命令在操作系统层⾯去触发浏览器的”native事件“,
模拟操作浏览器。WebdriverServer将操作结果Http Response返回给代码调⽤的客户端。
为了更清晰直观地看到这个是如何运转的,我们来在使⽤OWASP ZAP做代理,截获Http Request和Response来看⼀下。
⾸先安装OWASP ZAP或其他有代理功能的⼯具,设置SoapUI Proxy,如ZAP默认使⽤8080端⼝,则SoapUI配置如下:
配置完SoapUI端⼝后,好像需要重启SoapUI,然后在SoapUI 的⾃动化测试代码中,代理才能正常⼯作。
重新跑前⼀节FirefoxDriver的代码,查看截获的请求和响应。如下图所⽰:
可以清楚地看到代码与DriverServer之间是如何根据WebDriver协议连通的。
WebDriver协议是RESTful风格的。
回到我们的主题:Webdriver重新使⽤已打开的浏览器实例。
Webdriver实例都将重新打开⼀个浏览器,新建⼀个Session。Selenium并没有接⼝或⽅法可以使⽤已有Session。如果在⼀个测试⽤例中不将浏览器退出关闭,想要在另⼀个新的测试⽤例中使⽤已打开的浏览器的话,怎么办?Selenium Webdriver本省并没有这种接⼝。本⼈⾃⼰实现了⼀个基于FirefoxDriver的,因为我基本只⽤Firefox,IE 什么的,没需求,没动⼒啊,但是⼤概原理应该类似,差不多。
FirefoxDriver是主要是由startClient()和startSession()完成初始化。startClient()中打开浏览器,设置执⾏器HttpCommandExecutor。
StartSession执⾏New Session指令,获取SessionID,并根据响应,设置capabilities。
具体有兴趣的可以⾃⼰下载源代码,⾃⼰看。
根据上⽂,Webdriver 想要执⾏命令,需要1:WebdriverServer的地址 2:⼀个可⽤的SessionID 。
写⼀个⾃⼰的WebDriver类来new⼀个Webdriver。
其中的初始化代码如下(需要两个参数 Webdriver 的地址和SessionID):
public myFirefoxDriver(String localserver,String sessionID){
mystartClient(localserver);
mystartSession(sessionID);
}
代码例⼦:
测试⽤例1中打开浏览器,但是不退出关闭浏览器:
import org.openqa.selenium.By
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.support.ui.ExpectedCondition
import org.openqa.selenium.support.ui.WebDriverWait
import org.openqa.selenium.OutputType
import org.apachemons.io.FileUtils
import org.openqa.selenium.Keys
WebDriver driver = new FirefoxDriver()
try
{
<("learnsoapui.wordpress") // Url to be opened
//下⾯两⾏将所需的地址和SessionID 保存起来。样例因为是在SoapUI中的两个Step,所以保存为了SoapUI中
//⽤例级别的属性,具体请根据⾃⼰的使⽤环境保存为系统参数或其他地⽅
pertyValue( "CaseSession", SessionId().toString() )
log.SessionId().toString()
WebElement element = driver.findElement(By.id("s"))
element.sendKeys("Assertion")
File f1 = ScreenshotAs(OutputType.FILE)
element.submit()
}
catch(Exception e)
{
log.info "Exception encountered : " + e.message
}
测试⽤例2中继续使⽤1中已打开的浏览器:
FirefoxDriver;
import org.openqa.selenium.By
import org.openqa.selenium.WebDriver
import org.openqa.selenium.WebElement
import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.JavascriptExecutor
//下⾯三⾏,取出保存的可⽤的浏览器的Webdriver Server的地址和SessionID,new⼀个Webdriver。
def driverserver = PropertyValue( "DriverServer" )
def caseSession = PropertyValue( "CaseSession" )
WebDriver driver = new myFirefoxDriver(driverserver,caseSession)
log.info (CommandExecutor().getAddressOfRemoteServer())
try
{
driver.findElement(By.linkText("Home")).click()// Url to be opened
selenium怎么使用
driver.findElement(By.linkText("About Author")).click()// Url to be opened
log.SessionId().toString()
log.Capabilities()
((JavascriptExecutor)driver).executeScript("alert(\"hello,this is a alert!\")");
//driver.quit()
}
catch(Exception e)
{
log.info "Exception encountered : " + e.message
}
注:(1)webtest01.jar是我在Selenium 2.48.2版本的代码下编译的,本⼈只配合⽤过Selenium 2.48.
2  和Selenium 2.53.0这两个版本可⽤,其他的Selenium版本我是没试过的,说不定⽼版本不⽀持的。)
(2)实际中myFirefoxDriver不仅可以在本地⽤,⽤来RemoteWebdriver远程调⽤也是可以⽤的,即打开
RemoteWebdriver,然后⽤myFirefoxDriver来继续使⽤远程的那个已打开的浏览器实例,反正是只需要那两个参数就可以,反正我⾃⼰⽤的时候这种情况也是是可以⽤的。仅供参考,不提供技术⽀持,呃,后果⾃负哦。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。