简体   繁体   中英

Set selenium webdriver's default execution speed

I'm running some GUI tests with webdriver. I exported some tests directly from selenium IDE. In this test I had to decrease IDE's speed to run it due to the loading of a drop down. How can I slow down my test in Selenium webdriver? I already put

 driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);

and it kept running at a fast speed. I know the sleep option but that's not what I'm looking for, I would like to change the webdriver's default execution speed. Here's my code:

import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;

import java.util.concurrent.TimeUnit;

import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.NoAlertPresentException;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class ProfileCheck {
private WebDriver driver;
private String baseUrl;
private boolean acceptNextAlert = true;
private final StringBuffer verificationErrors = new StringBuffer();

@Before
public void setUp() throws Exception {
    driver = new FirefoxDriver();
    baseUrl = "http://localhost:8080";
    driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
}

@Test
public void testProfileCheck() throws Exception {
    System.out.println("Test if profiles have access to the screen");
    // Administrateur (has access)

    driver.get(baseUrl + "/Dashboard/index.jsp?lang=en");
    driver.findElement(By.cssSelector("input[name=combo_profile]")).click();
    driver.findElement(
            By.cssSelector(".x-boundlist-item:contains('Administrateur')"))
            .click();
    driver.get(baseUrl + "/Params/ClientCutOff/index.jsp?lang=en");
    try {
        assertTrue(driver.getTitle().matches("^[\\s\\S]*ClientCutOff$"));
    } catch (Error e) {
        verificationErrors.append(e.toString());
    }
    // Habilitation (no access)
    driver.get(baseUrl + "/Dashboard/index.jsp?lang=en");
    driver.findElement(By.cssSelector("input[name=combo_profile]")).click();
    driver.findElement(
            By.cssSelector(".x-boundlist-item:contains('Habilitation')"))
            .click();
    driver.get(baseUrl + "/Params/ClientCutOff/index.jsp?lang=en");
    try {
        assertFalse(driver.getTitle().matches("^[\\s\\S]*ClientCutOff$"));
    } catch (Error e) {
        verificationErrors.append(e.toString());
    }
}

@After
public void tearDown() throws Exception {

    try {
        Thread.sleep(5000);
        driver.quit();
    } catch (Exception e) {
    }
    String verificationErrorString = verificationErrors.toString();
    if (!"".equals(verificationErrorString)) {
        fail(verificationErrorString);
    }
}

private boolean isElementPresent(By by) {
    try {
        driver.findElement(by);
        return true;
    } catch (NoSuchElementException e) {
        return false;
    }
}

private boolean isAlertPresent() {
    try {
        driver.switchTo().alert();
        return true;
    } catch (NoAlertPresentException e) {
        return false;
    }
}

private String closeAlertAndGetItsText() {
    try {
        Alert alert = driver.switchTo().alert();
        String alertText = alert.getText();
        if (acceptNextAlert) {
            alert.accept();
        } else {
            alert.dismiss();
        }
        return alertText;
    } finally {
        acceptNextAlert = true;
    }
}
}

Read some answers and none helped

Decreasing the speed of Selenium Webdriver

https://sqa.stackexchange.com/questions/8451/how-can-i-reduce-the-execution-speed-in-webdriver-so-that-i-can-view-properly-wh

Selenium IDE - Set default speed to slow

Don't use sleep !!!

public static WebElement findElement(WebDriver driver, By selector, long timeOutInSeconds) {
    WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
    wait.until(ExpectedConditions.presenceOfElementLocated(selector));

    return findElement(driver, selector);
}

Once there was a "setSpeed()" method for the Java bindings of Selenium WebDriver. But it was deprecated, because it makes no sense regarding browser automation.

Instead if the driver is "faster" than the loading of your elements or sth similar, you should always make intelligent use of waits to handle these cases.

To sum it up, there is currently no option to deliberately slow down execution within WebDriver itself. there is no other way currently to explicitly slow down steps of yours other than implement Thread.sleep()

BUT there are some other options that you might explore:

For example you could write your own method to click elements if you want to slow down clicking of elements:

public void clickElement(WebElement element) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    element.click();
}

if you wanted to slowdown the findElement method you could write another helper method:

public void findElement(By by) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    driver.findElement(by);
}

You could even write your own extended class from one of the WebDriver classes as is described here like this:

public class MyFirefoxDriver extends FirefoxDriver {

@Override
public WebElement findElement(By by) {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    return by.findElement((SearchContext) this);
}

You could write these methods for all executions that you want to slow down.

Under normal circumstances, when it looks for an element, Selenium keeps trying to find an element for up to however long as you've set the value of "implicitly wait". This means that if the element is found sooner than that, it will continue with test execution. I am no expert in Java, but in the code you provide I can't identify any bits that are looking for a drop-down item. Since a drop-down menu can be loaded long before the actual items inside it are loaded, I would wager that therein lies your issue: it's looking for the drop-down itself, finds it, stops waiting and starts trying to execute the rest of the test, which fails because the items weren't loaded yet. The solution therefore would be to look for the specific item you're trying to select. Unfortunately I am not well-versed enough in Java to provide you with the actual code solution.

As an aside, in my experience when exporting from Selenium IDE to something else you end up with tests that are almost, but not quite, entirely unlike what you expect. They could be doing what you expect them to, but they usually take shortcuts or at least a different approach than you would if you were to code the tests yourself.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM