“你调用的对象是空的。”每个Android元素在Page Factory期间在Page对象模型上运行

时间:2019-10-02 06:23:33

标签: c# testing appium qa appium-android

这是我进行移动自动化的第一步,在SamplePage.cs上的Page Factory期间,我需要一些有关Android Elements初始化的帮助,下面是我的三个类:

TestBase.cs

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Enums;
using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Remote;
using System;
using AppiumDotNetSamples.Helper;
using AppiumDotNetSamples.Page;

namespace AppiumDotNetSamples
{
    public class TestBase 
    {
        protected AndroidDriver<AndroidElement> _driver;

        [SetUp()]
        public void BeforeAll()
        {
            DesiredCapabilities capabilities = new DesiredCapabilities();
            //capabilities.SetCapability(MobileCapabilityType.BrowserName, "");
            capabilities.SetCapability(MobileCapabilityType.PlatformName, "Android");
            capabilities.SetCapability(MobileCapabilityType.PlatformVersion, "7.1.2");
            capabilities.SetCapability(MobileCapabilityType.AutomationName, "UIAutomator2");
            capabilities.SetCapability(MobileCapabilityType.DeviceName, "3e52f2ee7d34");
            capabilities.SetCapability("appPackage", "com.google.android.calculator");
            capabilities.SetCapability("appActivity", "com.android.calculator2.Calculator");
            capabilities.SetCapability(MobileCapabilityType.App, App.AndroidApp());

            _driver = new AndroidDriver<AndroidElement>(Env.ServerUri(), capabilities, Env.INIT_TIMEOUT_SEC);
            _driver.Manage().Timeouts().ImplicitWait = Env.IMPLICIT_TIMEOUT_SEC;

        }

        [TearDown()]
        public void AfterAll()
        {
            _driver.Quit();
        }
    }
}

AndroidBasicInteractionsTest.cs

using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.Enums;
using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Remote;
using System;
using AppiumDotNetSamples.Helper;
using AppiumDotNetSamples.Page;

namespace AppiumDotNetSamples
{
    [TestFixture()]
    public class AndroidBasicInteractionsTest:TestBase
    {
        private SamplePage _samplePage;
        [SetUp()]
        public void SetUpForLogInTest()
        {
            _samplePage = new SamplePage(_driver);
           /* if (!_samplePage.isDisplayed())
            {
                return;
            }*/


        }
        [Test()]
        public void ClickOnButtonOne()
        {
            // AndroidElement buttonOne = _driver.FindElementById("com.google.android.calculator:id/digit_1");
            // buttonOne.Click();

            _samplePage.ClickOnButtonOne(); 
        }
    }
}

SamplePage.cs

using OpenQA.Selenium.Appium.Android;
using OpenQA.Selenium.Support.PageObjects;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenQA.Selenium.Appium.Interfaces;
using OpenQA.Selenium.Appium;
using OpenQA.Selenium.Appium.PageObjects.Attributes;
using OpenQA.Selenium.Support.UI;
using System.Threading;

namespace AppiumDotNetSamples.Page
{
    public class SamplePage
    {
        private AndroidDriver<AndroidElement> _driver;

        [FindsByAndroidUIAutomator(ID = "com.google.android.calculator:id/digit_1")]
        public AndroidElement _buttonOne;

        public SamplePage(AndroidDriver<AndroidElement> driver)
        {
            _driver = driver;
            PageFactory.InitElements(_driver, this);
        }

        public void ClickOnButtonOne()
        {
            //AndroidElement _buttonOne = _driver.FindElementById("com.google.android.calculator:id/digit_1");
            _buttonOne.Click();
        }

       /* public Boolean isDisplayed()
        {
            return _buttonOne.Displayed;
        }*/
    }
}

我有 Message: System.NullReferenceException : Object reference not set to an instance of an object.

错误,在调试期间我看到了 https://i.postimg.cc/SQDdXVpW/2019-10-02-08-08-41-Window.png

当我发表评论

[FindsByAndroidUIAutomator(ID = "com.google.android.calculator:id/digit_1")] public AndroidElement _buttonOne;

,然后从中删除评论 AndroidElement _buttonOne = _driver.FindElementById("com.google.android.calculator:id/digit_1"); 一切正常,在调试期间,我看到了 https://i.postimg.cc/Dy0g1s2R/2019-10-02-08-09-43-Window.png

我尝试了未注释的方法

{
return _buttonOne.Displayed; 
}

来自SamplePage.cs

和条件

if (!_samplePage.isDisplayed()) 
{
return;
}

来自AndroidBasicInteractionsTest:TestBase.cs,但无济于事。我究竟做错了什么?预先感谢。

编辑: 我还更改了构造函数,以确保在初始化之前可以看到元素:

 public SamplePage(AndroidDriver<AndroidElement> driver)
        {
            _driver = driver;
            if(_driver.FindElementById("com.google.android.calculator:id/digit_1").Displayed)
            PageFactory.InitElements(_driver, this);
        }

但是_buttonOne仍然为空。

0 个答案:

没有答案