【问题标题】:Evaluate passed object in function only仅在函数中评估传递的对象
【发布时间】:2021-10-04 01:27:25
【问题描述】:

我想将一个对象传递给 C# 函数,以便在函数中而不是之前对其进行评估。 这可能吗?

背景:我想检查特定的 WindowsElement 对于 UI 测试是否可见。当评估此元素时它不可用时(还)抛出异常。

当我编写一个期望此 WindowsElement 作为参数的函数时,它会在函数调用之前进行评估。但是我不能在它周围写一个 try/catch 块。

public static bool IsVisible(WindowsElement windowsElement) {
    try {
        return windowsElement.Displayed;
    }
    catch {
        return false;
    }
}

作为一种解决方法,我创建了一个没有输入参数并返回布尔值的 func 委托。这种方法的一个缺点是检查很长,我必须再次为每个 WindowsElement 插入这个 Func 委托。

Func<bool> isElementVisible = () => {
    try {
        return UIControls.MyWindowsElement.Displayed;
    }
    catch {
        return false;
    }
};

有没有办法结合这两种方法?

【问题讨论】:

    标签: c# appium


    【解决方案1】:

    你可以编写扩展方法来检查可见性

      class Program
    {
        static void Main(string[] args)
        {
    
            var element = new WindowsElement(null, "test");                       
            var isVisible = element.IsVisible();
            Console.WriteLine(isVisible);
        }
    }
    
    
    
    public static class WindowsElementExtensions
    {
         public static bool IsVisible(this WindowsElement windowsElement)
    {
        try
        {
            return windowsElement.Displayed;
        }
        catch
        {
            return false;
        }
    }
    

    }

    【讨论】:

    • 这会在调用element.IsVisible()时抛出异常,因为调用函数时该元素不存在。
    • 你可以通过添加空检查来避免element?.IsVisible()
    • 不幸的是,这也无济于事,因为在搜索元素时会抛出异常。
    • 你能复制这里的行为吗? dotnetfiddle.net
    • .ctor 有异常,不确定是故意的,提供的样本没人能解决。
    猜你喜欢
    • 2014-07-27
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    相关资源
    最近更新 更多