0

Selenium Webdriver テストを実行すると、非常に奇妙な問題が発生します。

私のコード

driver.findElement(By.id("id")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.className("green_true")).click();

要素は実際に存在します。問題のある URL が Web ドライバーによってクリックされていることもわかりますが、その後は何も起こりません。ブラウザはページに移動せず、green_true 要素を見つけられません。エラーが発生します。しかし、たまにしか。場合によっては、テストが正常に実行されることがあります。

これがどのようにできるか誰にもわかりますか?

選択した言語によって異なるため、正確な URL は使用できません。

4

2 に答える 2

0

動的要素をクリックするときは、明示的な待機を使用してみてください。要素がWebブラウザーに表示されるか、アクションが適用されるまで待ちます。このパターンを使用できます:

final FluentWait<WebDriver> wait =
            new FluentWait<WebDriver>(getDriver())
                    .withTimeout(MASK_PRESENCE_TIMEOUT, TimeUnit.SECONDS)
                    .pollingEvery(100, TimeUnit.MILLISECONDS)
                    .ignoring(NoSuchElementException.class)
                    .ignoring(StaleElementReferenceException.class)
                    .withMessage("Time out while waiting the element is loaded");

    wait.until(new Predicate<WebDriver>() {

        @Override
        public boolean apply(final WebDriver driver) {
            return ! driver.findElements(By.id("id")).isEmpty(); 
        }

    });
于 2012-10-16T10:35:23.137 に答える
0

良い。次のように変更することをお勧めします:

driver.findElement(By.id("id")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
driver.manage().timeouts().implicitlyWait(180, TimeUnit.SECONDS);
driver.findElement(By.className("green_true")).click();

以下を使用してみてください:

public WebElement fluentWait(final By locator){
        Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)
                .withTimeout(30, TimeUnit.SECONDS)
                .pollingEvery(5, TimeUnit.SECONDS)
                .ignoring(NoSuchElementException.class);

        WebElement foo = wait.until(
new Function<WebDriver, WebElement>() {
            public WebElement apply(WebDriver driver) {
                        return driver.findElement(locator);
                }
                }
);
                           return  foo;              }     ;

fluentWait(By.id("id")).click();
fluentWait(By.xpath("//a[starts-with(@href,'/problematic_url')]")).click();
fluentWait(By.className("green_true")).click();

問題は、要素を操作した後 (クリックなど)、ページ上で何らかの AJAX を取得する可能性があることです。私見では、もう少し堅牢な待機メカニズムを使用する必要があります。

アドバイス: webelement または css セレクターの xpath を取得したら、fireBug、ffox 拡張で見つかったロケーターを確認することを忘れないでください。 ロケーターが検証する よろしく。

于 2012-10-16T09:32:02.227 に答える