Как заменить момент ожидания Thread.sleep() в моем скрипте теста автоматизации

Я новичок в области автоматизации, и я использовал JUnit для разработки сценария тестирования автоматизации с использованием веб-драйвера selenium, отвечающего моим требованиям.

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

Поэтому мой вопрос: может ли кто-нибудь сказать тогда, как я даю динамическое время ожидания моему коду?

System.setProperty("webdriver.chrome.driver", "//path of the chrome driver");
driver = new ChromeDriver();

driver.get("https://url for my org");
Thread.sleep(5000); //to load the login page of my Org
driver.findElement(By.xpath("my login xpath")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("my login xpath")).sendKeys("username");
Thread.sleep(2000);
driver.findElement(By.xpath("my password xpath")).click();
Thread.sleep(1000);
driver.findElement(By.xpath("my password xpath")).sendKeys("my password");
driver.findElement(By.xpath("login button")).click();
Thread.sleep(6000); //for giving the time to login Org

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

Мой вопрос заключается в том, чтобы получить явное ожидание - предоставить постоянное время ожидания для разных мест, например, если мы определим следующее,

WebDriverWait wait = new WebDriverWait(driver, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.click();
//for another wait 
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("element_xpath")));
element.sendKeys("something"); //Here it's wait time(10 seconds) is same to the after the click action wait time. 

Так почему я жду в одно и то же время все мои секции ожидания без необходимости? если есть другой способ, пожалуйста, дайте мне знать?

Если я ошибаюсь, поправьте меня.

Благодарю.

3 ответа

Решение

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

ВНИМАНИЕ: не смешивайте неявные и явные ожидания. Это может привести к непредсказуемому времени ожидания.

Вместо этого вы должны использовать явные ожидания, например WebDriverWait, Вам не нужно ждать между вводом данных в поля. Мой общий подход заключается в том, чтобы дождаться, пока на странице не появится определенный элемент, указывающий, что страница закончила загрузку. Вы захотите выбрать один из последних элементов для загрузки на странице в случае, когда у вас есть длинный раздел загрузки / динамический. После загрузки этого элемента вы можете свободно вводить текст и т. Д. На странице. Единственное время, когда вам нужно подождать снова на той же странице, - это если вы запускаете какое-то динамическое поведение, такое как нажатие на ссылку, которая обновляет часть страницы, выбор из выпадающего списка, который вызывает перезагрузку другого выпадающего списка и т. Д.

Ваш код должен выглядеть больше как

driver.get("https://url for my org");
driver.findElement(By.xpath("my login xpath")).sendKeys("username");
driver.findElement(By.xpath("my password xpath")).sendKeys("my password");
driver.findElement(By.xpath("login button")).click();
// wait for element on newly loaded page and continue
  1. Вам не нужно ждать после перехода к URL. Selenium будет ждать браузера readyState быть complete,

  2. Вам не нужно нажимать на элемент перед использованием .sendKeys(),

  3. Вам (как правило) не нужно ждать между вводом данных в поля.

Во-первых, я бы очень хотел посоветовать вам использовать объекты страниц или что-то подобное. Это приведет вас в ад. Сказав, что для решения вашей проблемы вы можете использовать явное или явное ожидание, в зависимости от того, что вам больше подходит.

Если вы хотите использовать неявное ожидание, при инициализации драйвера используйте:

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

Если вы хотите использовать явное ожидание, используйте этот пример и сделайте его своим:

WebDriverWait wait = new WebDriverWait(driver, 10);

WebElement element = 
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("xpath")));

element.click();

В обоих примерах водитель будет ждать максимум 10 секунд. Если вы хотите узнать разницу между 2, проверьте ссылку и посмотреть, что подходит вам лучше всего

http://toolsqa.com/selenium-webdriver/implicit-explicit-n-fluent-wait/

Вы должны добавить неявное ожидание в вашей программе, как показано ниже

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
driver.get("https://url for my org");

Здесь неявное ожидание - это, по сути, ваш способ сообщить WebDriver, что он должен ждать 10 секунд (как упомянуто в коде) в тех случаях, когда указанный элемент недоступен в пользовательском интерфейсе (DOM), то есть перед выдачей исключения он будет ждать 10 секунд.

Как только вы добавили неявное ожидание, удалите все Thread.sleep(1000). Не рекомендуется писать Thread.sleep (1000) после каждого оператора.

Или вы можете использовать явное ожидание, как

// Create object of WebDriverWait class
WebDriverWait wait=new WebDriverWait(driver,20);    
// Wait till the element is not visible    
WebElement element=wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("ur xpath here")));
boolean status = element.isDisplayed();
//Then perform other action on element

Это ожидает до 20 секунд, прежде чем выдать исключение TimeoutException или если он обнаружит, что элемент вернет его через 0 - 20 секунд. По умолчанию WebDriverWait вызывает ExpectedCondition каждые 500 миллисекунд, пока не завершится успешно. Успешное возвращение для типа ExpectedCondition - логическое возвращаемое значение true или не нулевое возвращаемое значение для всех других типов ExpectedCondition.

Другие вопросы по тегам