Сохранение и повторное использование существующего экземпляра WebDriver браузера - Java

голоса
1

В основном каждый раз , когда я бег моего Java - код от затмения, WebDriver запускает новый браузер IE и успешно выполняет свои тесты по большей части. Тем не менее, у меня есть много тестов , чтобы бежать, и это боль , что WebDriver запускает новый сеанс браузера каждый раз. Мне нужен способ , чтобы повторно использовать ранее открытый браузер; так WebDriver откроет то в первый раз, то во второй раз, я запустить свою программу Eclipse, я хочу, чтобы просто забрать предыдущий экземпляр браузера и продолжают работать мои тесты на тот же экземпляр. Таким образом, я не запуская новый сеанс браузера каждый раз , когда я запускаю свою программу.

Скажем , у вас есть 100 тестов для запуска в затмении, вы попали на эту кнопку запуска , и они все бегут, а затем примерно в 87 - м теста вы получите сообщение об ошибке. Затем вернитесь в затмить, исправить эту ошибку, но тогда вам придется повторно запустить все 100 тестов снова с нуля.

Было бы неплохо , чтобы исправить ошибку на этой 87 - й тест , а затем возобновить выполнение с этого теста 87 - й , в отличие от повторного выполнения всех тестов с нуля, то есть из теста 0 вплоть до 100. Надеюсь, я достаточно ясно , чтобы получить некоторая помощь от вас , ребят, спасибо BTW.

Вот моя попытка ниже при попытке сохранить и повторно использовать экземпляр исследователь браузера WebDriver Интернет:

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;
    }
}


Я надеюсь , здесь было то , что с помощью переопределения метода startSession () из remoteWebdriver, было бы как - то проверить , что у меня уже был экземпляр WebDriver браузера открыт , т.е. , и было бы вместо того, чтобы использовать этот экземпляр в отличие от повторного создания нового экземпляра каждый раз, когда я ударил что кнопка «запустить» в затмении.

Я могу также видеть , что , потому что я создаю «новый экземпляр драйвера» от моего конструктора, поскольку конструктор всегда выполнить первый, он создает , что новый экземпляр драйвера автоматически, так что я , возможно , потребуется изменить что - то, но не знаю , как.

Я новичок как на StackOverflow и с селеном WebDriver и надеюсь, что кто-то здесь может помочь.

Благодаря!

Задан 13/08/2013 в 15:52
источник пользователем
На других языках...                            


4 ответов

голоса
4

Чтобы ответить на ваш вопрос:

Нет, вы не можете использовать браузер, который в настоящее время работает на вашем компьютере. Вы можете использовать один и тот же браузер для различных тестов, однако, до тех пор, как она находится на том же исполнении.

Тем не менее, это звучит как ваша реальная проблема работает 100 тестов снова и снова. Я бы рекомендовал использовать среду тестирования (например, TestNG или JUnit). С их помощью, вы можете указать, какие тесты вы хотите запустить (TestNG будет генерировать XML-файл, содержащий все тесты, которые терпят неудачу, поэтому, когда вы запустите его, он будет выполнять только неудавшиеся тесты).

Ответил 13/08/2013 в 16:01
источник пользователем

голоса
1

На самом деле вы можете повторно использовать тот же сеанс снова ..

В клиенте узла вы можете использовать следующий код для подключения к существующему селену сессии

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();

Для получения селена идентификатор сеанса,

driver.getSessionId();

Примечание: Эта функция доступна в клиенте Узла только .. Для того, чтобы сделать то же самое в JAVA или C #, вы должны переопределить метод выполнения селена, чтобы захватить SESSIONID и сохранить его в локальный файл и читать его снова прикрепить с существующей селеном сессии

Ответил 07/02/2016 в 08:52
источник пользователем

голоса
0

Я попытался его расширения классов (Java Inheritance) и создания файла XML. Я надеюсь, что ниже примеры помогут:

Класс 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 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 Suite: скопировать и вставить ниже код и изменить его соответствующим образом.

<?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>

Это будет работать над тремя классами. Это означает, что один браузер и различные тесты. Мы можем установить последовательность выполнения, установив имена классов в алфавитном порядке, как я делал в этих классах.

Ответил 16/02/2016 в 11:06
источник пользователем

голоса
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;

// Класс 1:

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 остается как есть.

С уважением, Мохит Baluja

Ответил 15/02/2016 в 10:21
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more