Элемент не готов к выбору, но wait.until() все еще продолжается независимо?

Я новичок в Selenium и довольно новичок в Java. Я тестировщик по профессии, а не разработчик, поэтому я пытаюсь постепенно преобразовать свои сценарии Selenium IDE во что-то более надежное и «правильное». К сожалению, я борюсь с довольно простой задачей. Как только веб-страница загружается, я хочу нажать кнопку. Это отлично работает в Selenium IDE, но только если я установил скорость «медленно».

Я могу заставить его работать, используя следующий код, но ТОЛЬКО если я включу строку thread.sleep. Я читал, что это не очень хорошая идея, поэтому я пытаюсь реализовать что-то более разумное, используя webDriverWait.

public class mytestclass {

    private WebDriver driver;
    private String baseUrl;

    @Before
    public void setUp() throws Exception {
        driver = new FirefoxDriver();
        baseUrl = "";
        driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);
    }


    @Test
    public void test1() throws Exception {
        driver.get(baseUrl + "file:///C:/_VM/testpage.html");
        WebDriverWait wait = new WebDriverWait(driver, 10);
        wait.until(ExpectedConditions.elementToBeClickable(By.id("button_X")));
        //Thread.sleep(2000);
        driver.findElement(By.id("button_X")).click();    
     }

}

Таким образом, тот факт, что это работает при выполнении строки thread.sleep, заставляет меня поверить, что строка wait.until возвращает значение true, когда кнопка на самом деле не готова. Я также пытался переключить ExpectedConditions на другие идентификаторы, такие как visibilityOfElementLocated (по локатору) и присутствияOfElementLocated (по локатору), но они действуют одинаково.

Я делаю что-то не так здесь? Есть ли что-то еще, что я могу попробовать?

Боюсь, я не могу дать ссылку на сайт, так как он связан с работой. Он читает много изображений и запускает много javascript при запуске, поэтому для запуска требуется некоторое время, но именно поэтому я хочу добавить логику ожидания!

Спасибо за любой совет.


person pledgeX    schedule 21.10.2014    source источник
comment
Я никогда не смешиваю явное и неявное ожидание, поэтому я не могу быть на 100% уверен, что их смешивание — это ваша проблема, но смешивание двух типов ожидания — это определенно то, чего вы не хотите делать. См. это и это. (Примечание: даже если другие вопросы заданы на других языках, это не имеет значения. Selenium в целом работает одинаково на разных языках.)   -  person Louis    schedule 21.10.2014


Ответы (1)


Запуск вашего сайта связан с jQuery? Если это так, вы можете попробовать это. Я нашел это полезным в своих тестах. Это на C#, но я уверен, что вы можете преобразовать его в java.

Подождите, пока jQuery не будет готов:

IWait<IWebDriver> wait = new WebDriverWait(Driver, TimeSpan.FromSeconds(WAITFORELEMENT_TIMEOUT));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
person JoriO    schedule 22.10.2014
comment
Спасибо за ответ. После небольшого поиска в Google мне удалось найти эквивалент вашего кода на основе Java, который выглядит следующим образом: private void waitForJQuery(WebDriver driver) { (new WebDriverWait(driver, 10)).until(new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { JavascriptExecutor js = (JavascriptExecutor) d; return (Boolean) js.executeScript("return jQuery.active == 0"); } }); } Я еще не совсем понял, как это работает (следующий в моем списке!), но это работает. - person pledgeX; 30.10.2014
comment
Это сработало очень хорошо для ячеек таблиц, которые обновляются через jQuery и, наконец, не должны использовать Sleep.Timeout. Спасибо! - person firecape; 11.03.2018