2017-08-31 90 views
1

我想在我的網站上使用硒web驅動程序的JavaScript自動化測試。使用等待與硒web驅動程序異步內容

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

但是,如果我嘗試用等待

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

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

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

我怎樣才能得到這個工作讓我等待我的內容,然後再繼續可用。

+0

這是夜間或???你應該爲你正在尋找的語言添加一個標籤。你有沒有相當於'WebDriverWait'?我的背景是C#/ Java,我只是等待顯示電子郵件元素等。 – JeffC

+0

[Nightwatch:比\'.pause(1000)\'更好的方法''以避免脆性測試?](https://stackoverflow.com/questions/33224546/nightwatch-better-way-than-pause1000-to-避免脆弱測試) – JeffC

+0

我使用Selenium-Java和Selenium-Python,我不知道Selenium-JavaScript中的語法。但我可以建議你一個策略。你會接受嗎? – DebanjanB

回答

1

隱含的等待會告訴網絡驅動程序等待一段時間,然後纔會拋出「無此類元素異常」。默認設置爲0。一旦我們設定的時間,網絡驅動程序將等待時間拋出異常之前..

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

嘗試使用FluentWait。由要等待並把它傳遞以下方法

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