1

基本上每次我从 Eclipse 运行我的 java 代码时,webdriver 都会启动一个新的 ie 浏览器并在大多数情况下成功执行我的测试。但是,我有很多测试要运行,而且 webdriver 每次都启动一个新的浏览器会话很痛苦。我需要一种重新使用以前打开的浏览器的方法;所以webdriver会第一次打开,然后第二次,我运行我的eclipse程序,我希望它简单地拿起以前的浏览器实例并继续在同一个实例上运行我的测试。这样,我每次运行程序时都不会启动新的浏览器会话。

假设你有 100 个测试要在 Eclipse 中运行,你点击了那个运行按钮,它们都运行了,然后在大约第 87 个测试时你得到一个错误。然后你回到eclipse,修复那个错误,但是你必须从头开始重新运行所有100个测试。

最好在第 87 次测试中修复错误,然后从第 87 次测试恢复执行,而不是从头开始重新执行所有测试,即从测试 0 一直到 100。希望我足够清楚你们的一些帮助,谢谢顺便说一句。

下面是我尝试维护和重用 webdriver Internet Explorer 浏览器实例的尝试:

public class demo extends RemoteWebDriver { 

    public static WebDriver driver;
    public Selenium selenium;
    public WebDriverWait wait;
    public String propertyFile;
    String getSessionId;


    public demo() { // constructor


        DesiredCapabilities ieCapabilities = DesiredCapabilities
                .internetExplorer();
        ieCapabilities
                .setCapability(
                        InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS,
                        true);
        driver = new InternetExplorerDriver(ieCapabilities);


        this.saveSessionIdToSomeStorage(getSessionId);
        this.startSession(ieCapabilities);
        driver.manage().window().maximize();
    }

    @Override
      protected void startSession(Capabilities desiredCapabilities) {
        String sid = getPreviousSessionIdFromSomeStorage();
        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());
        }
      }

    private void saveSessionIdToSomeStorage(String session) {
        session=((RemoteWebDriver) driver).getSessionId().toString();
    }

    private String getPreviousSessionIdFromSomeStorage() {
        return getSessionId;
    }
}


我的希望是,通过覆盖 remoteWebdriver 的 startSession() 方法,它会以某种方式检查我是否已经在 ie 中打开了一个 webdriver 浏览器的实例,而是使用该实例而不是每次我点击时都重新创建一个新实例日食中的那个“运行”按钮。

我还可以看到,因为我正在从我的构造函数创建一个“新驱动程序实例”,因为构造函数总是首先执行,它会自动创建新的驱动程序实例,所以我可能需要以某种方式改变它,但不知道如何。

我是 stackoverflow 和 selenium webdriver 的新手,希望这里有人可以提供帮助。

谢谢!

4

4 回答 4

4

要回答您的问题:

不可以。您不能使用当前在您的计算机上运行的浏览器。但是,您可以将相同的浏览器用于不同的测试,只要它在相同的执行中。

然而,听起来你真正的问题是一遍又一遍地运行 100 次测试。我建议使用测试框架(如 TestNG 或 JUnit)。使用这些,您可以指定要运行哪些测试(TestNG 将生成一个包含所有失败测试的 XML 文件,因此当您运行它时,它只会执行失败的测试)。

于 2013-08-13T15:01:29.123 回答
1

实际上,您可以再次重复使用相同的会话..

在节点客户端中,您可以使用以下代码附加到现有的 selenium 会话

var browser = wd.remote('http://localhost:4444/wd/hub');
browser.attach('df606fdd-f4b7-4651-aaba-fe37a39c86e3', function(err, capabilities) {
  // The 'capabilities' object as returned by sessionCapabilities
  if (err) { /* that session doesn't exist */ }
  else {
    browser.elementByCss("button.groovy-button", function(err, el) {
      ...
    });
  }
});
...
browser.detach();

要获取 selenium 会话 ID,

driver.getSessionId();

注意:这仅在 Node Client 中可用。要在 JAVA 或 C# 中执行相同的操作,您必须覆盖 selenium 的执行方法以捕获 sessionId 并将其保存在本地文件中并再次读取以附加现有的 selenium 会话

于 2016-02-07T08:52:56.207 回答
0

我尝试了以下步骤来使用相同的浏览器实例,它对我有用:

如果您在不同的包中有通用或 1 类,则下面的代码片段将起作用 -

package zgenerics;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.BeforeTest;
import org.openqa.selenium.WebDriver;

// 第一类:

public class Generics  {

public Generics(){}

protected WebDriver driver;

@BeforeTest

public void maxmen() throws InterruptedException, IOException{ 
driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    String appURL= "url";
    driver.get(appURL);
    String expectedTitle = "Title";
    String actualTitle= driver.getTitle();
    if(actualTitle.equals(expectedTitle)){
        System.out.println("Verification passed");
    }
    else {
        System.out.println("Verification failed");
    } }

// 第 2 类:

package automationScripts;
import org.openqa.selenium.By;
import org.testng.annotations.*;
import zgenerics.Generics;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.openqa.selenium.support.ui.ExpectedConditions;
public class Login extends Generics {
@Test
public void Login() throws InterruptedException, Exception {
WebDriverWait wait = new WebDriverWait(driver,25);

   wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("")));
   driver.findElement(By.cssSelector("")).sendKeys("");

    wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("")));
    driver.findElement(By.xpath("")).sendKeys("");

}
}

如果您的泛型类在同一个包中,您只需在代码中进行以下更改:

public class Generics  {

public Generics(){}

WebDriver driver; }

只需从 Webdriver 代码行中删除受保护的词。1 类的其余代码保持原样。

问候, Mohit Baluja

于 2016-02-15T10:21:12.630 回答
0

我已经通过扩展类(Java 继承)并创建一个 xml 文件来尝试它。我希望下面的例子会有所帮助:

第一类:

 package zgenerics;

import java.io.IOException;
import java.util.concurrent.TimeUnit;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.BeforeTest;
import org.openqa.selenium.WebDriver;

public class SetUp  {

public Generics(){}
protected WebDriver driver;

@BeforeTest
public void maxmen() throws InterruptedException, IOException{
    driver = new FirefoxDriver();
    driver.manage().window().maximize();
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); 
    String appURL= "URL";

    driver.get(appURL);

    String expectedTitle = "Title";

    String actualTitle= driver.getTitle();

    if(actualTitle.equals(expectedTitle)){
        System.out.println("Verification passed");
    }
    else {
        System.out.println("Verification failed");
    } }

第 2 类:

 package automationScripts;
import org.openqa.selenium.By;
import org.testng.annotations.Test;
import zgenerics.SetUp

 public class Conditions extends SetUp {

@Test
public void visible() throws InterruptedException{

    Thread.sleep(5000);
    boolean signINbutton=driver.findElement(By.xpath("xpath")).isEnabled();
    System.out.println(signINbutton);

    boolean SIGNTEXT=driver.findElement(By.xpath("xpath")).isDisplayed();
    System.out.println(SIGNTEXT);

    if (signINbutton==true && SIGNTEXT==true){
        System.out.println("Text and button is present");
           }
    else{
        System.out.println("Nothing is visible");
        }
       }
       }

第 3 类:

    package automationScripts;
    import java.io.IOException;
    import java.util.concurrent.TimeUnit;
    import org.openqa.selenium.By;
    import org.openqa.selenium.WebElement;
    import org.testng.annotations.Test;

public class Footer extends Conditions {

  @Test
  public void footerNew () throws InterruptedException{

    WebElement aboutUs = driver.findElement(By.cssSelector("CssSelector"));
    aboutUs.click();


    WebElement cancel = driver.findElement(By.xpath("xpath"));
    cancel.click();

    Thread.sleep(1000);

    WebElement TermsNCond = driver.findElement(By.xpath("xpath"));
    TermsNCond.click();
    }   
    }

现在使用以下代码创建一个 xml 文件,并将 testng.xml 作为 testng 套件运行:复制并粘贴以下代码并进行相应的编辑。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="TestSuite" parallel="classes" thread-count="3">
<test name="PackTest">
<classes>
   <class name="automationScripts.Footer"/>
</classes>

这将运行在三个类之上。这意味着一个浏览器和不同的测试。我们可以通过按字母顺序设置类名来设置执行顺序,就像我在上面的类中所做的那样。

于 2016-02-16T11:06:05.907 回答