2016-10-26 7 views
0

ウェブサイト"qtpselenium.com"にログインするには、以下のコードを書いています。Thread.sleepなしでセレンコードを書く必要があります

コード実行を一時停止するために、間にThread.sleepを指定すると、以下のコードはうまく動作します。 私がThread.sleepにコメントすると、コードが期待通りに機能しません。 要素が表示されるのを待つドライバを作るためにセレンの暗黙的および明示的な待機を使用しようとしましたが、コードはThread.sleepを使用するときにのみ期待通りに機能します。

Thraed.Sleepステートメントを使用せずに以下のコードを動作させる方法はありますか?

セレンコードでThread.sleepステートメントを使用することは悪い習慣ですか?

import java.util.concurrent.TimeUnit; 

import org.openqa.selenium.By; 
import org.openqa.selenium.WebDriver; 
import org.openqa.selenium.firefox.FirefoxDriver; 
import org.openqa.selenium.support.ui.ExpectedConditions; 
import org.openqa.selenium.support.ui.FluentWait; 

public class QTPSelenium { 

    public static WebDriver driver = null; 

    public static void main(String[] args) throws InterruptedException { 

     System.setProperty("webdriver.gecko.driver","C:\\Eclipse\\Drivers\\geckodriver.exe"); 
     driver = new FirefoxDriver(); 
     driver.get("http://qtpselenium.com/"); 

     driver.findElement(By.xpath(".//*[@class='btn btn-default member_login']")).click(); 
     Thread.sleep(10000);    

     driver.findElement(By.xpath("(//button[@type='submit'])[3]")).click(); 
     Thread.sleep(10000); 

     driver.findElement(By.id("email")).sendKeys("Some Email ID"); 
     driver.findElement(By.id("login-password")).sendKeys("Some Password"); 
     driver.findElement(By.xpath("html/body/main/div[2]/div/div/div[1]/div/div/div/form/button")).click(); 
    } 
} 
+0

を私はスリープの両方を取り出し、それがまったく待機して私のためにうまく働きました。私は、Chromeのドライバを使用しています... – JeffC

+0

[QMetry Automation Framework](https://qmetry.github.io/qaf/)の使用を開始することができます。内部的にこのような状況を自動的に処理する拡張webdriverとwebelementを提供します。また、明示的な待機条件[アサーション、検証](https://qmetry.github.io/qaf/latest/assertion_verification.html)が要素とともに利用可能です。たとえば、 'element.waitForPresent()'や 'element.assertPresent()'や 'element.verifyPresent()'などです。 – user861594

答えて

1

はい、通常、Thread.sleep()を使用することは悪い習慣です。睡眠は動的ではありません。彼らは指定された時間だけ待ちます...それ以上、少なくない。あなたが待っている要素が25msに戻ってくると、10秒間待つことになるので、これは一般的ではありません。要素が10.5秒になると、失敗します。自動化により、一貫性のある結果を維持しながら可能な限り速く進めたいと考えています。 WebDriverWaitを使用すると、スクリプトは一時停止して指定された条件を待つことができます。条件が満たされると、スクリプトは続行されます。条件が満たされない場合、スクリプトは指定された時間だけ一時停止し、条件が満たされるかタイムアウトが発生するまで(例外をスローする)再試行します。だから、待つのが妥当である限り待ってください。

代わりにWebDriverWaitを使用してください。 ExpectedConditionsを見てください。あなたが...要素の存在、クリック可能な要素などを待つことができる多くの条件があります。

私はgeckodriverに切り替えてもう一度コードを試しました。私はあなたのロケータをより具体的にするように変更しました。彼らは基本的に特定のテキストを含むタグを探しています。そのロケータを何度も再利用することができます。以下のコードは私のために働いています。私は睡眠を取り除き、WebDriverWaitに置き換えました。

driver.get("http://qtpselenium.com/"); 
driver.findElement(By.xpath("//button[contains(.,'Member Login')]")).click(); 
WebDriverWait wait = new WebDriverWait(driver, 5); // create a WebDriverWait that we will reuse 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//button[contains(.,'Login to Selenium Account')]"))).click(); 
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("email"))).sendKeys("Some Email ID"); 
driver.findElement(By.id("login-password")).sendKeys("Some Password"); 
driver.findElement(By.xpath("//button[contains(.,'Login')]")).click(); 
0

たぶんこれの代わりのThread.sleep()してみてください:

driver.manage().timeouts().pageLoadTimeout(10, TimeUnit.SECONDS); 
関連する問題