Использование Selenium Web Driver для получения значения ввода HTML
В HTML файле webapp имеется следующий код
<input type="text" name="prettyTime" id="prettyTime" class="ui-state-disabled prettyTime" readonly="readonly">
То, что на самом деле отображается на странице, представляет собой строку, отображающую время.
В Selenium Web Driver у меня есть объект WebElement
, ссылающийся на <input>
, используя
WebElement timeStamp = waitForElement(By.id("prettyTime"));
Я хочу получить значение WebElement
, или, другими словами, то, что напечатано на странице. Я пробовал все геттеры WebElement
, и ничего не получало фактическое значение, которое видит пользователь. Любая помощь? Спасибо.
Ответы
Ответ 1
Это своего рода хакерство, но оно работает.
Я использовал JavascriptExecutor
и добавил div
в HTML и изменил текст в div
на $('#prettyTime').val()
. Затем я использовал Selenium для извлечения div
и захватил его значение. После проверки правильности значения я удалил только что созданный div.
Ответ 2
Попробуйте element.getAttribute("value")
Свойство text
предназначено для текста в тегах элемента. Для элементов ввода отображаемый текст не обернут тегом <input>
, а не внутри атрибута value
.
Примечание. Дело имеет значение. Если вы укажете "Значение", вы получите значение "null". Это верно для С# по крайней мере.
Ответ 3
Вы можете сделать следующее:
webelement time=driver.findElement(By.id("input_name")).getAttribute("value");
это даст вам время, отображаемое на веб-странице.
Ответ 4
С селеном 2,
Я обычно пишу так:
WebElement element = driver.findElement(By.id("input_name"));
String elementval = element.getAttribute("value");
ИЛИ
String elementval = driver.findElement(By.id("input_name")).getAttribute("value");
Ответ 5
После ответа @ragzzy я использую
public static string Value(this IWebElement element, IJavaScriptExecutor javaScriptExecutor)
{
try
{
string value = javaScriptExecutor.ExecuteScript("return arguments[0].value", element) as string;
return value;
}
catch (Exception)
{
return null;
}
}
Он работает достаточно хорошо и не изменяет DOM
Ответ 6
Как уже упоминалось ранее, вы можете сделать что-то подобное
public String getVal(WebElement webElement) {
JavascriptExecutor e = (JavascriptExecutor) driver;
return (String) e.executeScript(String.format("return $('#%s').val();", webElement.getAttribute("id")));
}
Но, как вы можете видеть, ваш элемент должен иметь атрибут id
, а также jquery на вашей странице.
Ответ 7
Если входное значение заполняется script, которое имеет некоторую задержку (например, вызов AJAX), вам нужно подождать, пока вход не будет заполнен.
Например.
var w = new WebDriverWait(WebBrowser, TimeSpan.FromSeconds(10));
w.Until((d) => {
// Wait until the input has a value...
var elements = d.FindElements(By.Name(name));
var ele = elements.SingleOrDefault();
if (ele != null)
{
// Found a single element
if (ele.GetAttribute("value") != "")
{
// We have a value now
return true;
}
}
return false;
});
var e = WebBrowser.Current.FindElement(By.Name(name));
if (e.GetAttribute("value") != value)
{
Assert.Fail("Result contains a field named '{0}', but its value is '{1}', not '{2}' as expected", name, e.GetAttribute("value"), value);
}