2017-06-09 1 views
0

私は、WebアプリケーションのUIのクリックを自動化するためにSeleniumを使用しています。ページの1つにいくつかのボタンがあり、いくつかの詳細があります。彼らはすべて同じ名前ですが、いずれかをクリックすると大丈夫ですので、最初のものをクリックしています。しかし、時にはうまくいくこともありますが、しばしばうまくいきませんJAVA/Selenium - ページの最初のボタンをクリックすると、時間の50%が有効になります

WebElement DetailsButton = setPresentElementByXpath("//input[1][@type='button' and @value='Go to Details']"); 
DetailsButton.click(); 

私は要素を動的に待つためにsetPresentElementByXpathを使用しています。

private WebElement setPresentElementByXpath(String xpath) throws Exception { 
    WebElement myDynamicElement = (new WebDriverWait(driver, 15)) 
      .until(ExpectedConditions.presenceOfElementLocated(By.xpath(xpath))); 
    return myDynamicElement; 
    } 

私は間違っていますか?

編集:私はそれが失敗する箇所を言及するのを忘れました。それは問題なしでDetailsButton.click();を通過しますが、次のものをクリックすると失敗します。スクリーンショットとログには、ボタンをクリックした後に表示されるはずのページがなかったため、ボタンがクリックされていないと仮定しています。

+0

存在の代わりに 'ExpectedConditions.visibilityOfElement(WebElement要素)'を使ってみましたか?ページに表示される前にボタンをクリックしようとしている可能性がありますが、DOMには存在しています。 また、なぜXPathを使用していますか? XPathは非常に脆弱であり、私が確信している不快感を助けていません。可能であればCSSセレクタを使用してください。 – jaredgilmore

+0

visibilityOfElementで同じことが起こります。通常はIDを使用していますが、ケースでは私ができることは何でも使用できません。通常はxpath、習慣の力です。 – tom

+0

アクションクラスまたはJavaScriptエグゼキュータを使用するような他の方法で試してください – Murthi

答えて

0

ページの読み込み速度の変動とキャッシングが問題になることがあります。要素が見つからない例外が発生している場合は、ExpectedConditions.ElementToBeClickable(By)によってクリック可能になるようにExplicit Waitを使用します。

WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.elementToBeClickable(By.id("myDynamicElement"))); 

例外「別の要素は、クリックを受け取ることになるが、」あなたはJavaScriptExecutorと直接要素をクリックすることができます起こっている場合。注:JSアクションには戻り値がありません(動作しているかどうか)、Selenium .click()のように、クリック後にページロードが発生した場合はページロードを待機しません。

((IJavaScriptExecutor)driver).ExecuteScript("arguments[0].click()", element); 
+0

これをチェックするためにいくつかの固定された待機を追加したので、同期の問題ではなく、まだエラーが発生しています。私が言及したように、要素が見つけられ、可視であり、Seleniumはエラーを投げないのでクリックしたと考えます。私はそれが本当に読み込まれていないので、次の要素のタイムアウトを取得しています。 – tom

関連する問題