使用等待与selenium web驱动程序异步内容

时间:2017-08-31 01:05:15

标签: javascript html selenium selenium-webdriver auth0

我正在尝试使用selenium web driver for javascript在我的网站上自动化测试。

如何使用wait方法来处理运行测试,其中内容在页面加载时可能尚未就绪,例如数据来自外部api等?

在我的示例中,我的内容由外部js文件加载。您可以在this fiddle中查看该页面的内容。我无法在下面的代码中将其链接起来,因为小提琴会被包裹在iframe中。

    <head>
    <script src="https://cdn.auth0.com/js/lock/10.2/lock.min.js"></script>
    </head>

    <body onload="lock.show();">
            <div id="content">
            <script type="text/javascript">
    var domain = 'contoso.auth0.com';
    var clientID = 'DyG9nCwIEofSy66QM3oo5xU6NFs3TmvT';

    var lock = new Auth0Lock(clientID, domain);
    lock.show({
    focusInput: false,
    popup: true,
    }, function (err, profile, token) {
    alert(err);
    });
            </script>
    </div>
    </body>

我可以使用睡眠功能,但在超时结束后,我的内容无法保证。

    const {Builder, By, Key, until} = require('selenium-webdriver');

    let driver = new Builder()
            .forBrowser('firefox')
            .build();

    driver.get('MY_URL')
    driver.sleep(2000).then(function() {
        driver.findElement(By.name('email')).sendKeys('test@test.com')
        driver.findElement(By.name('password')).sendKeys('test')
        //driver.findElement(By.className('auth0-lock-submit')).click()
    })

但如果我尝试等待

    function login() {
        return driver.findElement(By.name('email')).sendKeys('test@test.com')
    }

    driver.get('MY_URL')
    driver.wait(login, 5000)

我得到NoSuchElementError: Unable to locate element: *[name="email"]

我如何才能使其工作,以便在继续之前等待我的内容可用。

1 个答案:

答案 0 :(得分:1)

隐式等待会告诉网络驱动程序在它抛出“没有这样的元素异常”之前等待一定的时间&#34;。默认设置为0.一旦我们设置了时间,Web驱动程序将在抛出异常之前等待该时间。

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

尝试使用FluentWait。创建您想要等待的元素的by函数,并在下面的方法

中传递它
WebElement waitsss(WebDriver driver, By elementIdentifier){
Wait<WebDriver> wait =
new FluentWait<WebDriver>(driver).withTimeout(60, TimeUnit.SECONDS) .pollingEvery(1, TimeUnit.SECONDS).ignoring(NoSuchElementException.class);

return wait.until(new Function<WebDriver, WebElement>()
{
public WebElement apply(WebDriver driver) {
return driver.findElement(elementIdentifier);
}});
}

显式等待代码:

WebDriverWait wait = new WebDriverWait(driver, 60);
WebElement element = wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//span[contains(.,'Next')]")));

参考: -

https://www.guru99.com/implicit-explicit-waits-selenium.html