Альтернатива для thread.sleep(9000) в каждой строке в селене

I have been using thread.sleep(9000) almost after every line of code in selenium which is making me wait for long.Can anybody suggest me an alternate way to reduce this.As my application is taking time load a page it needs to wait until a particular page is loaded to perform any action.

WebElement un = driver.findElement(By.id("login_username_id"));
            un.sendKeys(username);
            WebElement pwd = driver.findElement(By.id("login_password_id"));
            pwd.sendKeys(password);

            try {
                Thread.sleep(25000);
            } catch (InterruptedException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
            driver.findElement(By.id("login_submit_id")).click();
            try {
                Thread.sleep(9000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

Я хочу сократить использование thread.sleep после каждой строки и использовать одну общую функцию, чтобы она ждала, когда это необходимо.


person Vdev    schedule 25.05.2016    source источник


Ответы (3)


используйте приведенный ниже пример:

public class Main{

static WebDriver driver = new FirefoxDriver();

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

    WebElement un = driver.findElement(By.id("login_username_id"));
    un.sendKeys(username);
    WebElement pwd = driver.findElement(By.id("login_password_id"));
    pwd.sendKeys(password);

    waitForElement(By.id("ur id"),60);

    driver.findElement(By.id("login_submit_id")).click();

    waitForElement(By.id("ur id"),60);


}

/**
 * wait until expected element is visible
 *
 * @param   expectedElement     element to be expected
 * @param   timeout             Maximum timeout time
 */
public static void waitForElement(By expectedElement, int timeout) {
    try {
        WebDriverWait wait = new WebDriverWait(driver, timeout);
        wait.until(ExpectedConditions.visibilityOfElementLocated(expectedElement));

    } catch (Exception e) {
        e.printStackTrace();
        //System.out.println("print ur message here");
    }
}
}

если у вас есть путаница, дайте мне знать.

person noor    schedule 25.05.2016
comment
где я должен упомянуть элемент, я имею в виду, какую строку, и можете ли вы привести пример, это так? Скажите, если я хочу подождать после этого утверждения, как мне написать? driver.findElement(By.id(login_submit_id)).click(); - person Vdev; 25.05.2016
comment
используйте такой метод: waitForElement(By.id(login_submit_id), 60); - person noor; 25.05.2016
comment
вы также можете использовать By.cssSelector или By.class .... это будет ждать максимум 60 секунд ... но если элемент будет найден через 1 секунду, ожидание закончится - person noor; 25.05.2016
comment
например, у меня есть мой код таким образом.. можете ли вы добавить свой код и отправить мне общедоступный статический недействительный основной (String [] args) броски InterruptedException { WebDriver driver = new FirefoxDriver (); WebElement un = driver.findElement (By.id (login_username_id )); un.sendKeys (имя пользователя); WebElement pwd = driver.findElement(By.id(login_password_id)); pwd.sendKeys (пароль);/* попробуйте { Thread.sleep (25000); } catch (InterruptedException e1) { // TODO Автоматически сгенерированный блок catch e1.printStackTrace(); }*/ driver.findElement(By.id(login_submit_id)).click(); - person Vdev; 25.05.2016
comment
я дал полный пример класса в моем обновленном коде. скопируйте и импортируйте необходимые пакеты и запустите его. - person noor; 25.05.2016
comment
И после какого утверждения я должен использовать этот метод? - person Vdev; 25.05.2016
comment
Давайте продолжим это обсуждение в чате. - person noor; 25.05.2016
comment
это нормально... @Vdev? - person noor; 26.05.2016
comment
Здравствуйте, Noor, мне нужен ваш совет по поводу одной вещи, я реализовал структуру, управляемую данными, и написал несколько сценариев, что я могу сделать дальше и как вы судите, что мой код достаточно хорош в соответствии со стандартами? - person Vdev; 14.06.2016
comment
@Vdev на самом деле я думаю, что это еще один вопрос .... прежде всего, вы должны принять ответ, если ответ вам поможет, а затем вы можете задать другой вопрос с деталями для решения. stackoverflow не любит слишком долгий чат. - person noor; 14.06.2016

Привет, пожалуйста, используйте универсальное ожидание в своем скрипте, т.е. неявное ожидание

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

выше строка говорит селену ждать максимум 10 секунд для каждого веб-элемента, прежде чем выдавать какую-либо ошибку (обратите внимание, что вы можете увеличить или уменьшить секунды, это зависит от вас)

явное ожидание: когда вы хотите дождаться определенного веб-элемента (используйте это, когда вы думаете, что для загрузки определенного элемента требуется больше времени, чем обычно)

WebDriverWait wait = new WebDriverWait(driver, timeout);
wait.until(ExpectedConditions.visibilityOfElementLocated(your element));
person eduliant    schedule 25.05.2016
comment
я использовал этот оператор, но что, если я хочу ждать после каждого оператора? как мне его использовать? Скажем, мой элемент такой (By.id (login_password_id)); - person Vdev; 25.05.2016
comment
в этом случае используйте универсальное ожидание во время создания браузера, например, WebDriver driver = new FirefoxDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); - person eduliant; 25.05.2016
comment
но driver.manage не помогает, ожидает thread.sleep после каждой строки - person Vdev; 25.05.2016
comment
пожалуйста, увеличьте время driver.manage до 50 секунд, посмотрите, поможет ли это - person eduliant; 25.05.2016
comment
Нет, это не помогает, мне нужно написать что-то общее, чтобы избежать этого. Я получаю эту ошибку. Исключение в потоке main org.openqa.selenium.WebDriverException: элемент не доступен для клика в точке (858, 409.933349609375). Другой элемент получит клик: ‹div style=opacity: 0.7; id=loading-messages›‹/div› Продолжительность или время ожидания команды: 147 миллисекунд Информация о сборке: версия: «2.52.0», ревизия: «4c2593c», время: «2016-02-11 19:06:42» Информация о системе : host: 'desktop-svc71', ip: '10.2.2.54', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_73 ' - person Vdev; 25.05.2016
comment
Ожидание WebDriverWait = новое Ожидание WebDriver(драйвер, время ожидания); wait.until(ExpectedConditions.visibilityOfElementLocated(ваш элемент)); В этом вы можете сказать, как я могу написать для моего кода выше? - person Vdev; 25.05.2016
comment
привет, согласно вашей проблеме с ошибкой, это не неявное ожидание, его работающий нормально селен может щелкнуть. но элемент, на который вы хотите щелкнуть, еще не исправлен [позиция в html, поэтому другой элемент получит щелчок - person eduliant; 25.05.2016
comment
Чтобы устранить ошибку Exception в потоке main org.openqa.selenium.WebDriverException: элемент не доступен для клика в точке (858, 409.933349609375). пожалуйста, сделайте одну вещь, пожалуйста, измените форму браузера chrome на firefox или перейдите по этой ссылке " title="элемент селена не доступен для клика в точке"> stackoverflow.com/questions/37388866/ - person eduliant; 25.05.2016

Вы можете поставить утверждение о том, что «отображается ли конкретный элемент или нет», чтобы веб-драйвер тратил время на поиск этого элемента, что создавало задержку в выполнении.

Пример: страница может содержать какую-то кнопку, сделать ее целевой и сообщить веб-драйверу, чтобы найти ее.

person Venkatesh Yalavatthi    schedule 25.05.2016