Java 如何使用已打开的firefox在Selenium中进行测试

Java 如何使用已打开的firefox在Selenium中进行测试,java,selenium-webdriver,Java,Selenium Webdriver,本声明 WebDriver driver = new FirefoxDriver(); 始终打开Firefox的新实例窗口。它不使用已经打开的firefox 有人能告诉我如何使用已经打开的firefox进行测试而不是打开新的firefox吗?在进行测试时,您应该只实例化一次webdriver,然后将其作为构造函数中其他类的参数传递。大概是这样的: public class Test { WebDriver driver = new FirefoxDriver(); @Test public

本声明

WebDriver driver = new FirefoxDriver();
始终打开Firefox的新实例窗口。它不使用已经打开的firefox


有人能告诉我如何使用已经打开的firefox进行测试而不是打开新的firefox吗?

在进行测试时,您应该只实例化一次webdriver,然后将其作为构造函数中其他类的参数传递。大概是这样的:

public class Test {

WebDriver driver = new FirefoxDriver();
@Test
public void testHomePage() {
    HomePage hp = new HomePage(driver);
    //code here }
}


public class HomePage{
private static WebDriver driver;

public HomePage(WebDriver driver) {
    this.driver = driver;}
}

请小心,因为如果驱动程序崩溃一次,那么之后必须执行的所有测试用例都将受到影响,因为它们使用的是同一个驱动程序,您也将共享cookie,可能还有以前打开的会话,等等

更健壮的解决方案是为每个测试用例创建一个新的WebDriver,因为这样做可以减少所有测试用例对其他测试用例的依赖

如果激励您的原因是创建每个WebDriver所需的时间,那么您可以开始考虑并行运行测试用例,例如使用TestNG


感谢在Java中,当您说
new
时,一个新对象被实例化。对于WebDriver,每个
new
都是一个新的浏览器窗口

如果希望使用相同的浏览器,请使用相同的
驱动程序
对象

driver.get("URL PATH");
这将转到已打开浏览器的新Url。

使用远程Web驱动程序 像这样

System.Uri uri = new System.Uri("http://localhost:7055/hub");
WebDriver = new RemoteWebDriver(uri, DesiredCapabilities.Firefox());
它将使用已经打开的Firefox浏览器。 你可以在这篇博文中看到这种方法的细节

Java示例。 首先,您需要运行Selenium服务器

java -jar C:\selenium-server-standalone-2.53.0.jar
要启动新会话(第一个脚本):

然后,要重用(附加)该会话(第二个脚本):


请注意不同的端口号。

最好的方法是扩展RemoteWebDriver并覆盖startSession方法-:

步骤:

  • 使用命令-java-jar selenium-server-standalone-3.x.x.jar启动selenium服务器。默认情况下,会话从端口4444开始

  • 打开url

  • 启动新的firefox会话单击创建会话按钮并选择firefox浏览器

  • 会话启动后,复制会话id并将其粘贴到所需的属性文件或xml文件中

  • 从以下方法保存的文件中读取会话id

    @Override
      protected void startSession(Capabilities desiredCapabilities) {
      String sid = getSessionIDFromPropertyFile();
      if (sid != null) {
        setSessionId(sid);
        try {
          getCurrentUrl();
        } catch (WebDriverException e) {
          // session is not valid
          sid = null;
        }
      }
      if (sid == null) {
        super.startSession(desiredCapabilities);
        saveSessionIdToSomeStorage(getSessionId().toString());
      }
    }
    

  • 不,不可能。对不起,这是可能的。请查看下面我的答案,并访问此链接这是一个非常有用的功能。假设我们要在特定页面中测试某些内容。要到达该页面,我们必须登录,然后点击2-3个其他页面。如果该页面已经打开,那么我们可以直接测试它,而不是再次运行前面的所有步骤。但是“new WebDriver”只是指“WebDriver”类的新对象,它可能与“new browser window”不同,我看到我的答案比实际答案的上浮次数要多。我的答案现在可以标记为实际答案吗?直接要求OP考虑改变它(但是请注意,所接受的答案和最高的投票不是同一件事)。你知道Python等价物吗?这不是回答问题。这样做的动机不是这里的问题。这应该被否决;下面是正确答案。这根本没有回答问题。
    WebDriver driver = new RemoteWebDriver(
                            new URL("http://localhost:7055/hub"), 
                            DesiredCapabilities.firefox());
    
    @Override
      protected void startSession(Capabilities desiredCapabilities) {
      String sid = getSessionIDFromPropertyFile();
      if (sid != null) {
        setSessionId(sid);
        try {
          getCurrentUrl();
        } catch (WebDriverException e) {
          // session is not valid
          sid = null;
        }
      }
      if (sid == null) {
        super.startSession(desiredCapabilities);
        saveSessionIdToSomeStorage(getSessionId().toString());
      }
    }