Неявное ожидание не работает в рамках - PullRequest
0 голосов
/ 12 марта 2019

Пожалуйста, дайте мне разумное решение.Я применил ImplicitWait и его игнорирование времени ожидания и сбой сценария.что я должен сделать, чтобы заставить это работать.Загрузка сайта занимает около 10-15 секунд, я поставил время ожидания на 45 секунд.Ожидание около 3-4 секунд и выдача ошибки.

Вот код BaseClass моей платформы:

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.Keys;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.ie.InternetExplorerDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;

import com.ABC.PageObjects.LoginPage;
import com.ABC.Utilities.ReadConfig;

public class BaseClass {

    ReadConfig readconfig = new ReadConfig();
    public String baseUrl = readconfig.getApplicationUrl();
    public String baseUrl1 = readconfig.getApplicationUrl1();
    public String username = readconfig.getUsername();
    public String password = readconfig.getPassword();  
    public static WebDriver driver;
    public static Logger log;

    @Parameters("browser")
    @BeforeClass
    public void SetUp(String br) throws IOException {

        log = Logger.getLogger("ABC");
        PropertyConfigurator.configure("log4j.properties");

        if(br.equals("chrome")) {
            System.setProperty("webdriver.chrome.driver",readconfig.getChropath());
            driver = new ChromeDriver();    
        }
        else if(br.equals("firefox")) {
            System.setProperty("webdriver.gecko.driver",readconfig.getFirefoxpath());
            driver = new FirefoxDriver();   
        }
        else if(br.equals("ie")) {
            //System.setProperty("webdriver.gecko.driver",readconfig.getFirefoxpath());
            driver = new InternetExplorerDriver();  
        }

    driver.manage().timeouts().implicitlyWait(45, TimeUnit.SECONDS);// its waiting only 3-4 sec  
    driver.manage().window().maximize();

    driver.get(baseUrl);

    }



    @AfterClass(enabled = true)
    public void TearDown() {
        driver.quit();
    }
    public void captureScreen(WebDriver driver, String tname) throws IOException {
        TakesScreenshot ts = (TakesScreenshot) driver;
        File source = ts.getScreenshotAs(OutputType.FILE);
        File target = new File(System.getProperty("user.dir") + "/Screenshots/" + tname + ".png");
        FileUtils.copyFile(source, target);
        System.out.println("Screenshot taken");
    }

Это тестовый случай, когда неявное ожидание не работает

public class TC_001_LoginTest extends BaseClass {

    @Test
        public void Login() throws IOException {
            log.info("url is opened");
            LoginPage lp = new LoginPage(driver);
                lp.setUserName(username);
                log.info("Username entered");
                    lp.setPassword(password);
                    log.info("Password entered");
                        lp.clickSubmit();
                        log.info("clicked");`

Кто-нибудь знает, что происходит?

Это класс объектов моей страницы

public class LoginPage {

        WebDriver ldriver;

        public LoginPage(WebDriver rdriver)
        {
            ldriver=rdriver;
            PageFactory.initElements(rdriver, this);
        }

        @FindBy(name="username")
        @CacheLookup
        WebElement txtUserName;

        @FindBy(id="password")
        @CacheLookup
        WebElement txtPassword;

        @FindBy(id="btnLogin")
        @CacheLookup
        WebElement btnLogin;

        public void setUserName(String uname)
        {
            txtUserName.sendKeys(uname);
        }

        public void setPassword(String pwd)
        {
            txtPassword.sendKeys(pwd);
        }


        public void clickSubmit()
        {
            btnLogin.click();
        }   

Ответы [ 3 ]

0 голосов
/ 12 марта 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(".//*[contains(@class, 'block-ui-wrapper')]").Length == 0);

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

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

Вот мой полный файл расширений через Github. Я обертываю почти все функции Selenium. Я хорошо разбираюсь в Javascript, потому что JQuery на 100% надежен в поиске элементов, тогда как функция поиска Selenium имеет некоторые проблемы внутри таких вещей, как IFrames. Кроме того, JQuery имеет чрезвычайно надежный и супер-читабельный способ запроса элементов в DOM с использованием любого количества локаторов, будь то ID, класс, текст, псевдо-селекторы и т. Д .; все в одной строке запроса! (Отсутствие поддержки псевдо-селектора в Selenium css-селекторе может быть ограничением). Вот почему я использую его. Он гораздо более читабелен, чем xpath, проще в написании и на 100% надежен при правильном написании. Если у вас нет JQuery на тестируемых страницах, вы можете просто внедрить скрипт JQuery при каждой загрузке новой страницы.

Итак, я использую JQuery, чтобы найти и сгенерировать явный XPath для нужного элемента на странице, а затем передаю точный XPath логике Selenium «Поиск». Когда вы держите руку Selenium, нет проблем с поиском элементов.

https://gist.github.com/tsibiski/04410e9646ee9ced9f3794266d6c5a82

ПРИМЕЧАНИЕ: Вы можете комбинировать это с приведенной выше логикой щелчков, чтобы расширять щелчки и всегда ждать, пока объект, который вы пытаетесь щелкнуть, готов к щелчку. С моими расширениями вы можете ждать абсолютно любого условия, о котором только можете подумать, стихов с конкретными сценариями в явном ожидании и, конечно, общего ожидания в неявных.

Обратите внимание, как в моих методах расширения я расширяю Element.Click () в Element.ReliableClick (). Это не только обрабатывает труднее найти элементы, но и ждет, прежде чем нажать. Кроме того, вы можете сделать ряд вещей в этой абстрактной функции расширения, например, настраиваемые отчеты.

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

Если вы хотите быстрое исправление, вы можете добавить вызов WebDriverWait.until() в каждом из конструкторов объектов вашей страницы, например так: webDriverWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector(CSS_SELECTOR))), где CSS_SELECTOR будет локатором, который уникален на страницу, которую нужно ждать.

Например, если бы CSS_SELECTOR был идентификатором, это было бы "#some-unique-id", если бы это был какой-то уникальный класс, то это был бы ".some-unique-class", или уникальныйтег будет просто "some-unique-tag"

Это будет по существу ждать загрузки страницы после ее создания с помощью LoginPage lp = new LoginPage(driver) или любой другой страницы, которую вам нужно создать.

В вашем BaseClass классевам необходимо добавить объект public static WebDriverWait webDriverWait и создать его экземпляр следующим образом: webDriverWait = new WebDriverWait(driver, MAX_WAIT_SECONDS); где MAX_WAIT_SECONDS - максимальное количество секунд ожидания, прежде чем оно вызовет исключение.

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

Ниже приведены мои перегруженные методы для ожидания нажатия на элемент (или). Версия элемента жестко запрограммирована на ожидание 10 секунд, другой вы передаете секунды для ожидания в качестве второго параметра. Вы поняли идею. Очевидно, это будет использоваться вместо элемента объекта страницы.

/**
 * Wait until a web element is clickable by WebElement
 * @author Bill Hileman
 * @param ele - WebElement
 */
public void waitUntilClickable(WebElement ele) {

    (new WebDriverWait(driver, 10)).until(ExpectedConditions.elementToBeClickable(ele));

}

/**
 * Wait until a web element is clickable by locator
 * @author Bill Hileman
 * @param by - By
 */
public void waitUntilClickable(By by, int seconds) {

    (new WebDriverWait(driver, seconds)).until(ExpectedConditions.elementToBeClickable(by));

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