Selenium Firefox 驱动程序中 WebElement 的 GetAttribute Returns 空

GetAttribute of WebElement in Selenium Firefox Driver Returns Empty

所以我编写了一个测试,测试运行并使用 Selenium ChromeDriver 就好了。我的任务是让测试也在 FirefoxDriver 上运行。

我们在登录字段中输入文本的部分测试,然后检查登录字段以确保它已输入。我们查字段的方式是这样的

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

这在 Chrome 中工作得很好。但是它不在 Firefox 中。我调试测试的时候显示Text""或者empty/blank。如果我打开 Firefox,我可以这样做 document.getElementById("login").value 并且它 returns 是正确的值。

WebElement.GetAttributeFirefoxDriver 中的实现方式是否不同,还是我只是遗漏了什么?

很难说你的情况为什么在 Firefox 上不起作用,浏览器之间没有不同的实现。您可以尝试使用 IJavascriptExecutor 替代解决方案,如下所示:-

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

获得 attribute/property 的 Selenium 协议已经随着 Selenium 3 的发展而发展。

对于 Selenium 2,方法 WebElement.GetAttribute(...) returns HTMLElement 属性 存在时存在,否则为属性。

对于 Selenium 3,有一个独特的命令来获取 属性 和一个用于属性的命令: https://www.w3.org/TR/webdriver/#get-element-property

在您的情况下,您似乎正在使用 geckodriver (Selenium 3),客户端仅限于 Selenium 2 规格。它可以解释为什么 属性 没有返回。

要使其正常工作,您可以将 C# 客户端升级到 V3.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");