проверить, доступна ли кнопка? если не ждать 5 секунд и проверить еще раз? - PullRequest
4 голосов
/ 18 марта 2019

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

try {
    driver.findElement(By.xpath("//button[@id='btn_ok']")).click();
}catch (Exception e) {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}   

для контекста, здесь виноват кнопка.

<button type="submit" value="ok" name="s1" id="btn_ok" class="green">

Ответы [ 5 ]

2 голосов
/ 18 марта 2019

Вы можете использовать свободное ожидание этого. Это будет проверять возможность нажатия кнопки каждые 5 секунд в течение 30 секунд. Вы можете настроить время в соответствии с вашими потребностями. Попробуйте этот код и оставьте отзыв, работал ли он или нет.

 Wait<WebDriver> wait = new FluentWait<WebDriver>(driver)                           
                .withTimeout(30, TimeUnit.SECONDS)          
                .pollingEvery(5, TimeUnit.SECONDS)          
                .ignoring(NoSuchElementException.class);
        WebElement clickseleniumlink = wait.until(new Function<WebDriver, WebElement>(){

            public WebElement apply(WebDriver driver ) {
                return driver.findElement(By.xpath("//button[@id='btn_ok']"));
            }
        });
        clickseleniumlink.click();
1 голос
/ 18 марта 2019

Попробуйте так. Посмотрите, поможет ли это.

int size=driver.findElements(By.xpath("//button[@id='btn_ok']")).size();
if (size>0)
  {
    driver.findElement(By.xpath("//button[@id='btn_ok']")).click();
  }
  else
  {
    driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    int size1=driver.findElements(By.xpath("//button[@id='btn_ok']")).size();
    if (size1>0)
  {
    driver.findElement(By.xpath("//button[@id='btn_ok']")).click();
  }



}   
0 голосов
/ 18 марта 2019

Быстрый ответ

Пожалуйста, ознакомьтесь с приведенным ниже фрагментом кода и сообщите, решило ли оно вашу проблему.

    public synchronized boolean clickOnButtonWhenItBecomesClickable() {
        boolean buttonClicked=false;
        try {
            List<WebElement> element = driver.findElements(By.xpath("//button[@id='btn_ok']"));

            while(element.size()!=0) {
                // if any action needed to perform to display button, please do it.
                element = driver.findElements(By.xpath("//button[@id='btn_ok']"));
                if(element.size()!=0) {
                    wait = new FluentWait<WebDriver>((WebDriver) driver).withTimeout(30, TimeUnit.SECONDS).pollingEvery(5,
                            TimeUnit.SECONDS);
                    wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.xpath("//button[@id='btn_ok']"))));
                    buttonClicked=true;
                    break;  
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return buttonClicked;
    }
0 голосов
/ 18 марта 2019

Я предпочитаю это, так как буквально любое логическое условие "ждать до".

    public static void WaitUntil(this IWebDriver driver, Func<bool> Condition, float timeout = 10f)
    {

        float timer = timeout;
        while (!Condition.Invoke() && timer > 0f) {

            System.Threading.Thread.Sleep(500);
            timer -= 0.5f;

        }
        System.Threading.Thread.Sleep(500);

    }

    driver.WaitUntil(() => driver.FindElements(By.XPath("some xpath...").Length == 0);

    //Here is the particular benefit over normal Selenium waits. Being able to wait for things that have utterly nothing to do with Selenium, but are still sometimes valid things to wait for.
    driver.WaitUntil(() => "Something exists in the database");

Я обнаружил, что неявное ожидание доставляет мне больше хлопот, чем оно того стоит. И я нахожу, что явное ожидание селена может стать немного многословным, и оно не охватывает все, что мне нужно от него в моей среде, поэтому я сделал большое количество расширений. Вот один из них. Обратите внимание, я использую FindElements для приведенного выше примера, потому что я не хочу, чтобы исключение выдавалось, если ничего не найдено. Это должно работать для вас.

Примечание: это C #, но это не должно быть сложно изменить для любого языка (особенно Java). Если ваш язык не допускает таких расширений, просто вызовите метод непосредственно в классе. Вам нужно будет поместить это в статический класс, чтобы он был функциональным. Будьте осторожны при расширении существующих классов, подобных этому, в логике, так как это может запутать других, когда они пытаются определить, где определены методы.

0 голосов
/ 18 марта 2019

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

WebDriverWait wait = new WebDriverWait(driver, 5); // maximum wait time is 5 here, can be set to longer time
WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("btn_ok")));
button.click();

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...