Как можно дождаться, пока загрузчик страницы, который появляется и исчезает в зависимости от вызова API, исчезнет, ​​прежде чем выполнять действие с элементом - PullRequest
0 голосов
/ 30 апреля 2018

Как гласит заголовок, я пытаюсь выполнить действие (например, sendkeys или click и т. Д.) Над элементом, но загрузчик (с идентификатором) делает действие несовместимым.

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

Загрузчик (id = "spinner") исчезает со страницы после завершения вызова API (посылая сигнал сценарию, что это хорошо, чтобы идти вперед), но после запуска следующего вызова загрузчик возвращается, и затем исчезает после завершения (в настоящее время) 3 вызовов API. Я хотел бы найти способ, чтобы это работало независимо от того, сколько вызовов реализовано.

public void Loader()
{    
   WebDriverWait wait=new WebDriverWait(driver,50);
   WebElement CPloader = driver.findElement(By.id("spinner"));
   boolean test = wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));         

   if(test==false) {
       wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));
       wait.until(ExpectedConditions.invisibilityOf(CPloader));
       threadsleep(2000);
       wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));
       wait.until(ExpectedConditions.invisibilityOf(CPloader));
       threadsleep(2000);
       wait.until(ExpectedConditions.invisibilityOfElementLocated(By.id("spinner")));
       wait.until(ExpectedConditions.invisibilityOf(CPloader));
   }

}

В коде тестового сценария я обычно помещаю метод loader, threadsleep, метод loader в попытку удержать его достаточно долго, но я знаю, что это неправильно ... пример ниже:

Util.Loader();
Util.threadsleep(2000);
Util.Loader();
//click element or send keys etc

Я представляю, что это своего рода цикл с ожиданием невидимости, но, похоже, не могу понять это.

Любые указатели в правильном направлении будут очень полезны.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Я подхожу к этому, ожидая появления загрузчика, затем исчезая ... и делаю это в цикле. Как только загрузчик перестанет появляться, ожидание выдаст TimeoutException. Поймай это с помощью try-catch и вырвись из цикла. Возможно, вам придется настроить время ожидания 10 секунд вверх или вниз в зависимости от того, сколько времени обычно проходит между загрузкой счетчиков.

public static void Loader()
{
    By loader = By.id("spinner");
    WebDriverWait wait = new WebDriverWait(driver, 10);
    while (true)
    {
        try
        {
            wait.until(ExpectedConditions.visibilityOfElementLocated(loader));
            wait.until(ExpectedConditions.invisibilityOfElementLocated(loader));
        }
        catch (Exception e)
        {
            break;
        }
    }
}
0 голосов
/ 30 апреля 2018

Как вы упомянули, загрузчик (с идентификатором) делает действие непоследовательным , поэтому вместо вызова метода invisibilityOfElementLocated() для загрузчика вы можете вызвать elementToBeClickable() метод для нужного элемента, для которого вы намереваетесь вызвать click() или sendKeys() следующим образом:

  • Использование cssSelector и click :

    new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(By.cssSelector("cssSelector_of_element_to_interact"))).click();
    
  • Использование xpath и sendKeys :

    new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(By.xpath("xpath_of_element_to_interact']"))).sendKeys("Test");
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...