Selenium Firefox驱动程序中的WebElement的GetAttribute返回Empty

时间:2016-08-26 22:00:23

标签: selenium firefox selenium-webdriver selenium-firefoxdriver getattribute

所以我编写了一个测试,测试运行并使用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.GetAttributeFirefoxDriver的实现方式是否有所不同?或者我错过了什么?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

获取属性/属性的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#客户端升级到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");