Есть ли лучший метод Sleep (), чем Thread.Sleep ()? - PullRequest
0 голосов
/ 24 февраля 2020

Допустим, я пытаюсь найти элемент с именем element0,

driver.FindElement(element0).Click;
Thread.Sleep(5000);

В зависимости от скорости моего Wi-Fi, element0 может занять от 5000 до 10000 миллисекунд.

Необходимость постоянного изменения значения в Thread.Sleep() отрицательно скажется на цели автоматизации.

Окружение вокруг блока try catch может работать:

try
{
   driver.FindElement(element0).Click;
   Thread.Sleep(5000);
} 
catch(org.openqa.selenium.NoSuchElementException e)
{
   driver.FindElement(element0).Click;
   Thread.Sleep(5000);
}

Но если element0 все еще отсутствует после перехвата org.openqa.selenium.NoSuchElementException e, тогда он просто выдаст еще одну из тех же ошибок.

Есть ли лучший способ заставить мой код спать?

Могу ли я перебрать driver.FindElement(element0).Click в al oop до element0 присутствует?

Ответы [ 3 ]

1 голос
/ 24 февраля 2020

Явное селеновое ожидание для этой цели

import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

WebDriverWait wait = new WebDriverWait(WebDriverRefrence, 10);
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(element0));
element.click();

Это будет ожидать до до 10 секунд для видимости элемента. У вас есть еще Ожидаемые условия , которые вы можете выбрать.

0 голосов
/ 03 марта 2020

Thread.Sleep ()

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


implicitlyWait

При использовании Selenium вы можете заменить сон с неявным ожиданием . Индуцируя implicitlyWait экземпляр driver будет опрашивать дерево DOM , пока не будет найден элемент в течение настроенного периода времени, который ищет элемент или элементы перед броском NoSuchElementException .

  • Пример:

    • Python:

      driver.implicitly_wait(10)
      
    • Java:

      driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
      
    • Do tNet:

      driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(10);
      

ExplicitWait

Однако лучшим подходом было бы заменить sleep на ExplicitWait , который настраивает экземпляр драйвера для ожидания заданное c условие, которое должно быть выполнено перед переходом к следующей строке кода.

  • Пример:

    • Python :

      WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.CSS_SELECTOR, "element_css")))
      
    • Java:

      new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("element_css")));
      
    • Do tNet:

      new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(ExpectedConditions.ElementIsVisible(By.CssSelector("element_css")))
      
0 голосов
/ 24 февраля 2020

Также режим сна, используемый после findElement, приведет к паузе без всякого смысла, поскольку findElemen будет использовать определенные таймауты https://www.selenium.dev/selenium/docs/api/java/org/openqa/selenium/WebDriver.Timeouts.html

Вы можете неявно увеличить тайм-аут ожидания для элемента ожидания.

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