2017-09-11 28 views
1

私はthisのWebサイトを自動化していますが、ExplicitWaitの問題を抱えています。DOMから要素が削除された場合、ExplicitWaitを削除します

シナリオはユーザー名を送信した後にログインリンクまたは送信ボタンをクリックすると、プロセス中にローダーが表示され、プロセスが完了するとローダーはDOMから削除されます。

私は

new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar"))); 

以下のようにinvisibilityOfElementLocatedのための条件を使用していた。しかし、これは正しい時間、それはより多くの時間を割いては(ないexectly 60秒が、周り15~20または30秒のかもしれません。)その後、許可を予測することはできません次のコマンドを実行する。

私は4つのコマンドの前に、ログインプロセスを完了するために必要な行を入れなければなりません。だからログインをするのに約90秒かかったようだ。

を使用しないか、Impliciwaitを削除しないと、ローダーが他の要素の代わりにクリックを得るたびにスクリプトが失敗します。

私がこれまで試したコード:

WebDriver driver = new FirefoxDriver(); 

System.out.println("Browser Opened"); 
driver.manage().window().maximize(); 
driver.get("https://www.rcontacts.in"); 
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);  
System.out.println("URL Opened"); 
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar"))); 
driver.findElement(By.cssSelector(".ng-scope>a span[translate='login.register']")).click(); 
System.out.println("Register Link Clicked"); 
driver.findElement(By.name("userId")).sendKeys("9422307801"); 
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar"))); 
driver.findElement(By.xpath("//button[@type='submit']")).click(); 
System.out.println("Mobile number entered"); 
new WebDriverWait(driver, 60).until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar"))); 

はすぐローダが削除されますと、それはアクションを実行開始する任意の解決策はありますか?

ORは、ローダー要素がDOMから削除されるまで待つことができます。一度削除すると、私はさらなるアクションを続けることができますか?

+0

)(=新しいFluentWait(ドライバ).withTimeout(60秒).pollingEvery(5秒) '少ないポーリング時間を待って、それが助けかどうかを確認し、' driver.manageを変更待っ '試してみてください。タイムアウトを"012"、 "TimeUnit.SECONDS"、 " –

+0

"それは消費されたようです "またはそれは実際に消費しただけです。既に起こったイベントを待っていますか?そのローディングバーが実際に画面上にどれだけ長く留まるかについては何も言わなかった。私が知っているすべてのために、あなたはすでに良い解決策を持っています。 –

+1

@ TarunLalwaniのデフォルトのポーリング時間は500ミリ秒で、ほとんどのアプリケーションですでに十分です。それを変更する際に、特に高い数値に変更する必要はありません。 –

答えて

0

まあ、そことして読み込み、生成されたログメッセージ、から明らかであるwebsiteの問題のようだ:

1505129591769 Marionette DEBUG Canceled page load listener because no navigation has been detected 

しかし、それはinvisibilityOfElementLocated(By.id("loading-bar")からelementToBeClickable(By.xpath("//span[contains(text(),'Register')]")ExpectedConditions句を変更すると、私与えそうです80%の成功率。ここに私のWindows 8ボックスの効果的なコードブロックは次のとおりです。

System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe"); 
WebDriver driver = new FirefoxDriver(); 
driver.get("https://www.rcontacts.in"); 
System.out.println("URL Opened"); 
WebDriverWait wait = new WebDriverWait (driver, 15); 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[contains(text(),'Register')]"))); 
driver.findElement(By.xpath("//span[contains(text(),'Register')]")).click(); 
System.out.println("Register Link clicked"); 

あなたが実行を開始しながら、geckodriverのないダングリングインスタンスは(Task Managerを介して)存在しないことを確認してください。

the docsによると
+0

@DebhanjanBに入るまでに時間がかかる他の要素でスクリプトが失敗します。返信ありがとうございます。それでも失敗する。ログインには5つのステップがあります。1.ログインリンクをクリックします。2.モバイル番号を入力します。3.送信をクリックします。4.パスワードを入力します。5.送信をクリックします。各ステップのローダーを表示します。私は次の要素clickableの代わりにローダーの不可視を待つあなたのソリューションを試してみました。それは失敗の原因となる – NarendraR

+0

私はセレン2.53.1のためにクロム45を使用しているので、geckodriver – NarendraR

1

WARNING:暗黙的および明示的な待機を混在させないでください。そうすると、予期しない待ち時間が発生する可能性があります。

これはおそらく問題の原因です。暗黙の待機を使用しないことをお勧めします。私はそれらを削除し、必要に応じて明示的な待機を追加し、それがどうなるかを見てみましょう。

私はあなたのコードを取り、それを書き換えました(以下)、毎回私のために働いています。

String url = "https://www.rcontacts.in"; 
driver.navigate().to(url); 
waitForLoader(); 
driver.findElement(By.cssSelector("span[translate='login.register']")).click(); 
waitForLoader(); 
driver.findElement(By.cssSelector("input[name='userId']")).sendKeys("9422307801"); 
driver.findElement(By.cssSelector("button[translate='common.btns.next']")).click(); 

私が時々持っていた問題は、スクリプトが何度も飛び跳ねていたことでした。waitForLoader()にコードを追加して、ローダーが表示されるのを待ってから表示されなくなりました(表示されません)。私がそれをしたら、それは100%の時間を費やしました。

public static void waitForLoader() 
{ 
    WebDriverWait wait = new WebDriverWait(driver, 10); 
    wait.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.id("loading-bar"))); 
    wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("loading-bar"))); 
} 
+0

と心配しないでくださいありがとうが、それはまた動作していないようです。今それは私を投げるローダーの可視性のTimeOutException – NarendraR

+0

私はあなたが何を変更したか分かりません。私は10回以上投稿したコードを実行し、10回、問題は発生しませんでした。 – JeffC

+0

あなたは正しいかもしれません。クリックを提出するまではうまく動作しますが、ログインを完了しようとするとパスワードを入力して提出してください。その場合は失敗します。あなたが言及したのと同じアプローチを使っています。 – NarendraR

関連する問題