如果激活了多个驱动程序,是不是可以使用 Selenium 和 Appium 打开活动驱动程序的 session_id?

Posted

技术标签:

【中文标题】如果激活了多个驱动程序,是不是可以使用 Selenium 和 Appium 打开活动驱动程序的 session_id?【英文标题】:Is it possible to get session_id of active driver opened with Selenium and Appium if several drivers were activated?如果激活了多个驱动程序,是否可以使用 Selenium 和 Appium 打开活动驱动程序的 session_id? 【发布时间】:2016-07-28 07:56:14 【问题描述】:

在自动化时,我会打开几个浏览器,比如 Firefox,使用

driver1 = webdriver.Firefox()
driver2 = webdriver.Firefox()
driver3 = webdriver.Firefox()
.....

有没有办法获取活动浏览器的session_id 和 webdriver 本身? Appium 也有同样的问题。是否可以获得session_id 和活动设备(虚拟或真实)的驱动程序本身?

【问题讨论】:

AFAIK。 Selenium 对系统组件没有任何控制权。 selenium 的所有窗口都处于活动状态,其中一个驱动程序同时查看一个选项卡。我假设您需要一些 KeySend 进入窗口,因为此操作需要一个活动的系统窗口。 JS 对 Windows 状态有一定的了解,因此您可以通过 Selenium 注入一些代码,这些代码会显示设置 cookie “ACTIVE WINDOW”。你可以用不同的线程拉饼干。替代方案将是一些机器人或其他跟踪窗口或许多单独显示器的工具。 我不记得我需要激活浏览器的原因(那是 2 年前)。刚才我检查了现在使用任何(活动或非活动)浏览器进行任何操作都有问题。比方说,在上面介绍之后我们有以下代码: driver1.get('google.com/xhtml'); search_box = driver.find_element_by_name('q'); search_box.send_keys('geckodriver'); driver2.get('google.com/xhtml'); search_box = driver.find_element_by_name('q'); search_box.send_keys('geckodriver');而且这段代码会成功! 【参考方案1】:

使用 Selenium / Java 获取驱动程序会话 ID:

WebDriver driver = new FirefoxDriver();

SessionId session = ((FirefoxDriver)driver).getSessionId();
System.out.println("Session id: " + session.toString());

使用 Selenium / Java 获取远程驱动程序会话 ID:

DesiredCapabilities capabilities = DesiredCapabilities.firefox();
WebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:4722/wd/hub"), capabilities);

SessionId session = ((RemoteWebDriver)driver).getSessionId();
System.out.println("Session id: " + session.toString());

【讨论】:

这不是我真正想要的。它只返回已定义驱动程序的 session_id。假设您有几个打开的浏览器。我想获取当前(活动)驱动程序的 id 和驱动程序本身。 如果您启动 3 个浏览器,那么您最终将拥有 3 个活动浏览器。目前没有这样的活动浏览器。如果您指的是前台窗口,那么它应该是最后一次启动的浏览器,在您的情况下是 driver3。 是的,很明显 前台窗口 是最后一个启动的浏览器,driver3。但是假设您想编写一个与前景窗口一起工作的类。首先,前台窗口应该用类的一些方法来定义,我正在寻找获取它的方法。 使用 Selenium,浏览器无需聚焦(设置为前景窗口)即可自动化。【参考方案2】:
((ChromeDriver)driver).sessionId();

【讨论】:

【参考方案3】:

有解决该问题的方法。您可以创建一个会话。这为您提供了 Webdriver 实例,还提供了 sessionID。

DefaultDriverFactory defaultDriverFactory = new DefaultDriverFactory(Platform.WINDOWS); 
TemporaryFilesystem temporaryFilesystem = TemporaryFilesystem.getDefaultTmpFS(); 
ChromeOptions chromeOptions = new ChromeOptions();
Session session = DefaultSession.createSession(defaultDriverFactory, temporaryFilesystem, chromeOptions); 
WebDriver webDriver = session.getDriver();
SessionId sessionId = session.getSessionId(); 

【讨论】:

【参考方案4】:

使用 DriverFactory。下面的 sn-p (用 Katalon Studio 写的,但是使用 selenium,所以我猜它在其他工具中会相似或相同)

import com.kms.katalon.core.webui.driver.DriverFactory as DriverFactory
import org.openqa.selenium.WebDriver as WebDriver

WebDriver driver1 = new ChromeDriver()
WebDriver driver2 = new ChromeDriver()

DriverFactory.changeWebDriver(driver1)
driver1.get("https://www.example.com")
println DriverFactory.webDriver

DriverFactory.changeWebDriver(driver2)
driver2.get("https://news.example.com")
println DriverFactory.webDriver

将打印到控制台:

ChromeDriver: chrome on XP (fc70e83ced12b3e9beed990e88670d8e)
ChromeDriver: chrome on XP (a810d0cf94dbaf1cbd018542f9c983c3)

在括号中带有会话 ID。

【讨论】:

正确。我修好了它。谢谢 来自 Katalon 的 related official post 可能对像我这样对您的解决方案感兴趣的人有所帮助。非常感谢。 我的 Katalon 7.5.5 在println DriverFactory.webDriver 时不打印 sessionid 你得到了什么? @Male Mrse 我添加了导入行以帮助我们轻松尝试您的代码。如果它们不是您的隐含导入,请更正它们。

以上是关于如果激活了多个驱动程序,是不是可以使用 Selenium 和 Appium 打开活动驱动程序的 session_id?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以使用 IntPtr 在另一个程序中激活选项卡?

Android密钥库系统KeyStore

使用 AVAudioPlayer 同时播放多个声音

安卓应用中的用户激活码

KMS 激活正版

不小心激活了电子保修卡怎么办