Selenium WebDriver可靠的测试

Ela*_*Ela 5 selenium selenium-rc selenium-webdriver

我知道这个问题以前被问过很多次,但是我仍然找不到适合我的解决方案。在大多数情况下,我使用Selenium WebDriver运行测试时,它们会因“ NoSuchElementException”而失败。我尝试使用显式和隐式等待,但似乎没有任何效果。因此,除了使用Waits之外,还有其他方法可以使测试更可靠吗?

我在FirefoxDriver中使用selenium-java-2.31.0。以下是一些我试图使测试更可靠的代码示例:

public void waitAndClickElement(WebDriver driver, final By selector) {
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(50, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);
        WebElement elementToClick = wait
                .until(new Function<WebDriver, WebElement>() {
                    public WebElement apply(WebDriver driver) {
                        return driver.findElement(selector);
                    }

                });
        waitForElementVisible(driver, selector);
        elementToClick.click();
         }
Run Code Online (Sandbox Code Playgroud)

..和这个:

public WebElement waitForElementPresent(WebDriver driver, final By selector){
    Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
            .withTimeout(70, TimeUnit.SECONDS)
            .pollingEvery(5, TimeUnit.SECONDS)
            .ignoring(NoSuchElementException.class);
    WebElement elementToClick = wait
            .until(new Function<WebDriver, WebElement>() {
                public WebElement apply(WebDriver driver) {
                    return driver.findElement(selector);
                }
            });
    return elementToClick;

    } 
Run Code Online (Sandbox Code Playgroud)

...和这个:

WebDriverWait wait = new WebDriverWait(driver, 50);
WebElement user_name = wait.until(visibilityOfElementLocated(By.xpath("//*@id='userName']")));
Run Code Online (Sandbox Code Playgroud)

...和这个:

driver.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS);
Run Code Online (Sandbox Code Playgroud)

...最后是我尝试使之更可靠的测试之一:

@Test
public void test1{
 waitAndClickElement(driver, By.xpath("//*[@id='linkLogIn']"));
        waitForElementPresent(driver, By.xpath("//*[@id='userName']")).sendKeys("name");
        waitForElementPresent(driver, By.xpath("//*[@id='inputEmail']")).sendKeys("email@gmail.com");
        waitForElementPresent(driver,By.xpath("//*[@id='resetPassword']")).click();
        assertTrue(isElementPresent(By.xpath("//*[@id='moduleMain']")));
Run Code Online (Sandbox Code Playgroud)

}

谢谢!

e1c*_*che 0

您是否尝试过逐个捕获元素而不使用所有这些 wait 和 wait.until?

只是喜欢:WebElement username = driver.findelement(By.id("userName"));

你能顺便放下你的html吗?

编辑:

我可以建议的是:

protected void sleep(int i) {
driver.manage().timeouts().implicitlyWait(i, TimeUnit.SECONDS); 
}

@test
void test(){
driver.findElement(By.id("linkLogIn")).click(); sleep(6);
driver.findElement(By.id("userName")).sendKeys("user"); sleep(1);
driver.findElement(By.id("inputEmail")).sendKeys("mail@gmail.com"); sleep(1);
driver.findElement(By.id("resetPassword")).click(); sleep(10);
Assert.assertTrue(isElementPresent(By.id("moduleMain")));
}
Run Code Online (Sandbox Code Playgroud)