Maintain and re-use existing webdriver browser instance - java

前端 未结 4 1332
不思量自难忘°
不思量自难忘° 2021-01-16 03:19

Basically every time I run my java code from eclipse, webdriver launches a new ie browser and executes my tests successfully for the most part. However, I have a lot of test

相关标签:
4条回答
  • 2021-01-16 03:30

    To answer your question:

    No. You can't use a browser that is currently running on your computer. You can use the same browser for the different tests, however, as long as it is on the same execution.

    However, it sounds like your real problem is running 100 tests over and over again. I would recommend using a testing framework (like TestNG or JUnit). With these, you can specify which tests you want to run (TestNG will generate an XML file of all of the tests that fail, so when you run it, it will only execute the failed tests).

    0 讨论(0)
  • 2021-01-16 03:31

    Actually you can re-use the same session again..

    In node client you can use following code to attach to existing selenium session

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

    To get selenium session id,

    driver.getSessionId();
    

    Note: This is available in Node Client only.. To do the same thing in JAVA or C#, you have to override execute method of selenium to capture the sessionId and save it in local file and read it again to attach with existing selenium session

    0 讨论(0)
  • 2021-01-16 03:46

    I have tried the below steps to use the same browser instance and it worked for me:

    If you are having generic or Class 1 in different package the below code snippet will work -

    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;
    

    // Class 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");
        } }
    

    // Class 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("");
    
    }
    }
    

    If your Generics class is in the same package you just need to make below change in your code:

    public class Generics  {
    
    public Generics(){}
    
    WebDriver driver; }
    

    Just remove the protected word from Webdriver code line. Rest code of class 1 remain as it is.

    Regards, Mohit Baluja

    0 讨论(0)
  • 2021-01-16 03:48

    I have tried it by extension of classes(Java Inheritance) and creating an xml file. I hope below examples will help:

    Class 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");
        } }
    

    Class 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");
            }
           }
           }
    

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

    Now Create an xml file with below code for example and run the testng.xml as testng suite: copy and paste below code and edit it accordingly.

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

    This will run above three classes. That means one browser and different tests. We can set the execution sequence by setting the class names in alphabetical order as i have done in above classes.

    0 讨论(0)
提交回复
热议问题