将Action类与PageObject IWebElement

时间:2017-03-17 15:40:21

标签: c# selenium-webdriver pageobjects

在我的PageObject类中,IWebElement的定义如下:

[FindsBy(How = How.XPath, Using = "//input[contains(@ng-model,'model.BrancheName')]/following-sibling::span")]
private IWebElement TooltipBrancheName;

以下方法获取此工具提示的文本:

public string GetTooltiptekstDatabaseBranche()
        {
            string text = TooltipBrancheName.GetAttribute("class");
            Actions actions = new Actions(driver);
            actions.MoveToElement(TooltipBrancheName).Perform();
            //actions.MoveToElement(driver.FindElement(By.XPath("//input[contains(@ng-model,'model.BrancheName')]/following-sibling::span"))).Perform();
            return TooltipBrancheName.GetAttribute("title");
        }

当我从测试类调用此方法时, System.Refelection.TargetException:Object与目标类型不匹配。使用MoveToElement方法抛出异常。

方法中的第一行代码仅用于检查ToolTipBrancheName IWebElement属性是否存在且不是Null,这是因为它为class属性提供了正确的值。

当我取消注释注释行并注释该行给出异常时,该方法正常工作。使用的定位器在两行中都是相同的。我很好奇是什么导致了这个异常,字段 ToolTipBrancheName 存在,不是Null并且类型正确 IWebElement

2 个答案:

答案 0 :(得分:0)

在第二行尝试这个,也许它有效:

private IWebElement TooltipBrancheName {get; set;}

答案 1 :(得分:0)

一点历史:

昨天我在测试一个使用反射比较两个DTO的方法时遇到了同样的异常。我的问题是,我偶然使用了两个不同的DTO类(例如ServerDTO, AccountDTO),当反射从第一个DTO获得属性时,它在第二个DTO中找不到它。

WILD猜测:

我要在这里采取远景并猜测你的FindsBy返回的内容与WebDriver返回的内容不同。如果您的驱动程序是(例如)ChromeDriver,则返回ChromeWebElement,但MAYBE,FindsBy(因为该属性与webdriver无关),返回IWebElement(它使用WebElement接口)。

BUT

当您使用Actions actions = new Actions(driver);时,它可能必须使用WebDriver的对象(ChromeWebElementFireFoxWebElement,取决于您使用的驱动程序)。当Perform()运行时,它使用反射来获取WebElement的属性(例外是一个死的赠品)。此时,也许它假设元素是ChromeWebElement而不是IWebElement,(因此例外,它会尝试获得ChromeWebElement但不是{{1}的内容就像我偶然发现DTO一样。)

P.S。我上面所说的是纯粹的假设,但也许它可能是一个帮助进一步调查的打击。