GetAttribute WebElement в драйвере Selenium Firefox возвращает пустое значение

Итак, у меня есть тест, который был написан, и тест запускается и работает с использованием Selenium ChromeDriver просто отлично. Мне также было поручено заставить тесты работать на FirefoxDriver.

В рамках теста мы вводим текст в поле входа в систему, а затем проверяем поле входа, чтобы убедиться, что он был введен. Как мы проверяем поле, так

public virtual string Text => WebElement.GetAttribute("value");
while (!Text.Equals(inputText) && count++ < 3)

Это отлично работает в Chrome. Однако это не в Firefox. Когда я отлаживаю тест, он показывает, что Text равно "" или пусто/пусто. Если я открою Firefox, я смогу сделать это document.getElementById("login").value, и он вернет правильное значение.

WebElement.GetAttribute реализовано по-другому в FirefoxDriver или я просто что-то упустил?


person Cistoran    schedule 26.08.2016    source источник


Ответы (2)


В вашем случае сложно сказать, почему не работает Firefox, между браузерами нет разных реализаций. Вместо этого вы можете попробовать альтернативное решение, используя IJavascriptExecutor, как показано ниже: -

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
string Text = (string)js.ExecuteScript("return arguments[0].value", WebElement);
person Saurabh Gaur    schedule 27.08.2016

Протокол Selenium для получения атрибута/свойства эволюционировал в Selenium 3.

В Selenium 2 метод WebElement.GetAttribute(...) возвращает свойство HTMLElement, если оно присутствует, и атрибут в противном случае.

В Selenium 3 есть отдельная команда для получения свойства и одна для атрибута: https://www.w3.org/TR/webdriver/#get-element-property

В вашем случае кажется, что вы используете geckodriver (Selenium 3) с клиентом, ограниченным спецификациями Selenium 2. Это объясняет, почему имущество не возвращается.

Чтобы это заработало, вы можете обновить клиент C# до версии 3.0.0-beta2: https://github.com/SeleniumHQ/selenium/blob/master/dotnet/CHANGELOG https://github.com/SeleniumHQ/selenium/commit/a573338f7f575ccb0069575700f2c059dc94c3b8

Или вы можете реализовать свой собственный GetProperty в расширении метода:

static string GetProperty(this IWebElement element, string property) {
    var driver = (RemoteWebDriver)((RemoteWebElement)element).WrappedDriver;
    var result = (IList)driver.ExecuteScript(@"
        var element = arguments[0], property = arguments[1];
        if (property in element) return [true, '' + element[property]];
        return [false, 'Missing property: ' + property];
      ", element, property);

    bool succeed = (bool)result[0];
    if (!succeed) throw new WebDriverException((string)result[1]);

    return (string)result[1];
}

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

string value = driver.FindElement(...).GetProperty("value");
person Florent B.    schedule 27.08.2016
comment
Это имеет смысл. Я использовал geckodriver и Selenium 3.0 beta2, но Visual Studio продолжала говорить мне, что GetProperty по какой-то причине недействителен, и мне пришлось прибегнуть к использованию Javascript в сообщении Saurabh Gaur. - person Cistoran; 29.08.2016