Webdriver не может найти элемент по локатору, установленному как переменная в другом классе - PullRequest
0 голосов
/ 07 января 2019

Я написал автоматизированные тесты с помощью JUnit, Selenium Webdriver (v. 3.141.59) и Chromedriver (v. 2.45).

Сначала я написал тест для входа в систему:

[...]
void loginTest() {
    driver().findElement(By.id("login-button")).click();
    driver().findElement(By.id("name")).sendKeys("mail@xx.com");
    driver().findElement(By.id("password")).sendKeys("password");
    driver().findElement(By.id("send")).click();
    assertTrue(driver().findElement(By.id("logged-in-msg")).isDisplayed());
}

Все работало нормально, все хорошо, тест зеленый.

Затем я получил несколько более сложных и длинных идентификаторов и путей, которые мне пришлось использовать, поэтому я решил сделать тесты короткими и приятными и поместить все свои локаторы в отдельный класс, например:

public class LocatorsList {
public static final String
        SIGN_IN_BUTTON = "login-button",
        LOG_IN_USERNAME = "name",
        LOG_IN_PASSWORD = "password",
        LOG_IN_BUTTON = "send",
        SUCCESS_MSG = "logged-in-msg";
}

И мой тест:

[...]
void loginTest() {
    driver().findElement(By.id(SIGN_IN_BUTTON)).click();
    driver().findElement(By.id(LOG_IN_USERNAME)).sendKeys("mail@xx.com");
    driver().findElement(By.id(LOG_IN_PASSWORD)).sendKeys("password");
    driver().findElement(By.id(LOG_IN_BUTTON)).click();
    assertTrue(driver().findElement(By.id(SUCCESS_MSG)).isDisplayed());
}

Тогда он перестал работать. Webdriver отправляет ошибки:

org.openqa.selenium.NoSuchElementException: no such element: 
Unable to locate element: {"method":"id","selector":"name"}

Пока я смотрел, как проходит мой тест, этот элемент был прямо на странице, веб-драйвер даже щелкал по нему, как если бы он хотел заполнить поле ... но это не так. Говорит «невозможно найти элемент». Я пытался изменить версии хромедрайвера и селена, но это не помогло.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Если честно, это единственное реальное изменение в коде, то может ли это быть так просто, как если бы вы пропустили имя класса перед строкой? То есть:

driver().findElement(By.id(LocatorsList.SIGN_IN_BUTTON)).click()

0 голосов
/ 07 января 2019

Это, скорее всего, из-за отсутствия элемента, вам нужно дождаться загрузки элемента. Используйте

WebDriverWait wait = new WebDriverWait(driver, 20);
wait.until(ExpectedConditions.presenceOfElementLocated((By.id(LOG_IN_USERNAME))));

После этого вы можете выполнить действие над этим конкретным элементом, скажем, событие sendKeys.

public class Testing {

    public static final String 
    SIGN_IN_BUTTON = "jsid-login-button",
    LOG_IN_USERNAME = "login-email-name",
    LOG_IN_PASSWORD = "login-email-password",
    LOG_IN_BUTTON = "input[type='submit']";

    WebDriver driver;

    @BeforeMethod
    public void setUp() {
        System.setProperty("webdriver.chrome.driver", <driverLocation>);
        driver = new ChromeDriver();
        driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
        driver.get("https://9gag.com/");
    }

    @Test
    public void demoTest() {
        driver.findElement(By.id(SIGN_IN_BUTTON)).click();
        WebDriverWait wait = new WebDriverWait(driver, 20);
        wait.until(ExpectedConditions.presenceOfElementLocated((By.id(LOG_IN_USERNAME))));
        driver.findElement(By.id(LOG_IN_USERNAME)).sendKeys(<YOUR_EMAIL>);
        driver.findElement(By.id(LOG_IN_PASSWORD)).sendKeys(<YOUR_PASSWORD>);
        driver.findElement(By.cssSelector(LOG_IN_BUTTON)).click();
    }

    @AfterMethod
    public void tearDown() {
        driver.quit();
    }

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