javascript - Using wait with selenium web driver async content - Stack Overflow

I am trying to automate a test on my site using selenium web driver for javascript.How can I approach r

I am trying to automate a test on my site using selenium web driver for javascript.

How can I approach running tests here using the wait method with content that may not be ready when the page loads eg data es from an external api etc?

In my example my content is getting loaded by an external js file. You can see what the page looks like in this fiddle I couldn't link it in my code below as the fiddle gets wrapped in an iframe.

    <head>
    <script src=".2/lock.min.js"></script>
    </head>

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

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

I can get it working using sleep, but can't guarentee my content will be ready after the timeout has finished.

    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('[email protected]')
        driver.findElement(By.name('password')).sendKeys('test')
        //driver.findElement(By.className('auth0-lock-submit')).click()
    })

But if I try with wait

    function login() {
        return driver.findElement(By.name('email')).sendKeys('[email protected]')
    }

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

I get NoSuchElementError: Unable to locate element: *[name="email"]

How can I get this working so that I wait for my content to be available before proceeding.

I am trying to automate a test on my site using selenium web driver for javascript.

How can I approach running tests here using the wait method with content that may not be ready when the page loads eg data es from an external api etc?

In my example my content is getting loaded by an external js file. You can see what the page looks like in this fiddle I couldn't link it in my code below as the fiddle gets wrapped in an iframe.

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

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

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

I can get it working using sleep, but can't guarentee my content will be ready after the timeout has finished.

    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('[email protected]')
        driver.findElement(By.name('password')).sendKeys('test')
        //driver.findElement(By.className('auth0-lock-submit')).click()
    })

But if I try with wait

    function login() {
        return driver.findElement(By.name('email')).sendKeys('[email protected]')
    }

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

I get NoSuchElementError: Unable to locate element: *[name="email"]

How can I get this working so that I wait for my content to be available before proceeding.

Share Improve this question asked Aug 31, 2017 at 1:05 ak85ak85 4,26420 gold badges71 silver badges114 bronze badges 3
  • Is this nightwatch or ??? You should add a tag for the language that you are looking for. Do you not have the equivalent of WebDriverWait? My background is C#/Java and I would just wait for the email element, etc. to be displayed. – JeffC Commented Aug 31, 2017 at 4:01
  • Possible duplicate of Nightwatch: Better way than `.pause(1000)` to avoid brittle tests? – JeffC Commented Aug 31, 2017 at 4:03
  • I work with Selenium-Java and Selenium-Python, I am not aware about the syntax in Selenium-JavaScript. But I can suggest you a strategy. Will it be acceptable for you? – undetected Selenium Commented Aug 31, 2017 at 7:57
Add a ment  | 

1 Answer 1

Reset to default 1

The implicit wait will tell to the web driver to wait for certain amount of time before it throws a "No Such Element Exception". The default setting is 0. Once we set the time, web driver will wait for that time before throwing an exception..

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

Try to use FluentWait. Create a by function of your element which you want to wait and pass it in below method

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

Code for Explicit wait:

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

refer :-

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

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1745648400a4638110.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信