Skip to content

OpenQA.Selenium.NoSuchElementException : Couldn't locate an element by these strategies: Locator map when element in defined in the Page object #385

@Ukrainis

Description

@Ukrainis

Description

When element is defined inside Page object, then I am getting this kind of error (see stack-trace). Elements, which are found using method: _driver.FindElementByXPath or _driver.FindElementById using the same selectors are working fine.

Environment

  • Target framework: net core 2.1
  • Appium server: 1.15.1
  • Desktop OS/version used to run Appium if necessary: Windows 10
  • Mobile platform/version under test: Google nexus with Android 5.1.1 and OnePlus5 with Android 9
  • Real device or emulator/simulator: real devices

Details

Test method, named - PlusTest() is failing, other tests are passing. Seems, like it is related to this post: #163

Code To Reproduce Issue [ Good To Have ]

CalculatorMainPage.cs:

namespace AppiumPilotProject
{
    public class CalculatorMainPage
    {
        [FindsByAndroidUIAutomator(XPath = "//android.widget.Button[@resource-id='com.android.calculator2:id/digit_2']")]
        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/digit_2']")]
        public IWebElement Digit2Btn { get; set; }

        [FindsByAndroidUIAutomator(XPath = "//android.widget.Button[@resource-id='com.android.calculator2:id/digit_5']")]
        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/digit_5']")]
        public IWebElement Digit5Btn { get; set; }

        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/digit_9")]
        public IWebElement Digit9Btn { get; set; }

        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/op_add")]
        public IWebElement PlusBtn { get; set; }

        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/op_sub")]
        public IWebElement MinusBtn { get; set; }

        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/op_mul")]
        public IWebElement MultiplyBtn { get; set; }

        [FindsBy(How = How.XPath, Using = "//android.widget.Button[@resource-id='com.android.calculator2:id/eq")]
        public IWebElement EqualsBtn { get; set; }

        [FindsBy(How = How.XPath, Using = "//android.widget.EditText[@resource-id='com.android.calculator2:id/formula")]
        public IWebElement ResultField { get; set; }
    }
}

UnitTests.cs:

namespace AppiumPilotProject
{
    public class Tests
    {
        private AndroidDriver<AppiumWebElement> _driver;
        private CalculatorMainPage _calculatorMainPage;
        private AppiumLocalService _appiumLocalService;

        [SetUp]
        public void Setup()
        {
            _appiumLocalService = new AppiumServiceBuilder().UsingAnyFreePort().Build();
            _appiumLocalService.Start();

            DriverOptions caps = new AppiumOptions();
            caps.AddAdditionalCapability(MobileCapabilityType.DeviceName, "R32CC02AGJK");
            caps.AddAdditionalCapability("appPackage", "com.android.calculator2");
           // caps.AddAdditionalCapability(MobileCapabilityType.App, "com.oneplus.calculator");
            caps.AddAdditionalCapability("appActivity", "com.android.calculator2.Calculator");
          //  caps.AddAdditionalCapability("appActivity", "com.oneplus.calculator.Calculator");
            caps.AddAdditionalCapability(MobileCapabilityType.PlatformName, "Android");
            caps.AddAdditionalCapability(MobileCapabilityType.PlatformVersion, "5.1.1");
      //      caps.AddAdditionalCapability(MobileCapabilityType.NoReset, true);
            caps.AddAdditionalCapability(MobileCapabilityType.AutomationName, "UiAutomator2");

            //     _driver = new AndroidDriver<AppiumWebElement>(
            //         _appiumLocalService, caps);
            _driver = new AndroidDriver<AppiumWebElement>(
                new Uri("http://127.0.0.1:4723/wd/hub"), caps);

            TimeOutDuration timeSpan = new TimeOutDuration(new TimeSpan(0, 0, 0, 10, 0));

            _calculatorMainPage = new CalculatorMainPage();

            PageFactory.InitElements(_driver, _calculatorMainPage, new AppiumPageObjectMemberDecorator(timeSpan));
        }

        [Test]
        public void PlusTest()
        {
            _calculatorMainPage.Digit5Btn.Click();
            
            _calculatorMainPage.PlusBtn.Click();
            
            _calculatorMainPage.Digit2Btn.Click();
            
            _calculatorMainPage.EqualsBtn.Click();

            var result = _calculatorMainPage.ResultField.Text;

            Assert.AreEqual(14, int.Parse(result));
        }

        [Test]
        public void MinusTest()
        {
            AppiumWebElement firstNumber =
                _driver.FindElementByXPath("//android.widget.Button[@resource-id='com.android.calculator2:id/digit_5']");//FindElementById("com.android.calculator2:id/digit_5");
            firstNumber.Click();

            AppiumWebElement plusButton = _driver.FindElementByXPath("//android.widget.Button[@resource-id='com.android.calculator2:id/op_sub']");
            plusButton.Click();

            AppiumWebElement secondNumber = _driver.FindElementByXPath("//android.widget.Button[@resource-id='com.android.calculator2:id/digit_2']");
            secondNumber.Click();

            AppiumWebElement equalsButton = _driver.FindElementByXPath("//android.widget.Button[@resource-id='com.android.calculator2:id/eq']");
            equalsButton.Click();

            AppiumWebElement resultField = _driver.FindElementByXPath("//android.widget.EditText[@resource-id='com.android.calculator2:id/formula']");
            var result = resultField.Text;
            var intResult = int.Parse(result);
            Console.WriteLine(intResult);

            Assert.AreEqual(3, intResult);
        }

        [Test]
        public void MultipleTest()
        {
            IWebElement firstNumber = _driver.FindElementById("com.android.calculator2:id/digit_5");
            firstNumber.Click();

            IWebElement plusButton = _driver.FindElementById("com.android.calculator2:id/op_mul");
            plusButton.Click();

            IWebElement secondNumber = _driver.FindElementById("com.android.calculator2:id/digit_9");
            secondNumber.Click();

            IWebElement equalsButton = _driver.FindElementById("com.android.calculator2:id/eq");
            equalsButton.Click();

            IWebElement resultField = _driver.FindElementById("com.android.calculator2:id/formula");
            var result = resultField.Text;

            Assert.AreEqual(45, int.Parse(result));
        }

        [TearDown]
        public void AfterTest()
        {
            _driver.Quit();
            _appiumLocalService.Dispose();
        }
    }
}

Exception stacktraces

Test Name:	PlusTest
Test FullName:	AppiumPilotProject.Tests.PlusTest
Test Source:	D:\c#_projects\AppiumPilotProject\AppiumPilotProject\UnitTest1.cs : line 49
Test Outcome:	Failed
Test Duration:	0:00:14,993

Result StackTrace:	
at OpenQA.Selenium.Appium.PageObjects.Interceptors.ElementInterceptor.getTarget(IInvocation ignored)
   at OpenQA.Selenium.Appium.PageObjects.Interceptors.SearchingInterceptor.Intercept(IInvocation invocation)
   at Castle.DynamicProxy.AbstractInvocation.Proceed()
   at AppiumPilotProject.Tests.PlusTest() in D:\c#_projects\AppiumPilotProject\AppiumPilotProject\UnitTest1.cs:line 54
--WebDriverTimeoutException
   at OpenQA.Selenium.Support.UI.DefaultWait`1.ThrowTimeoutException(String exceptionMessage, Exception lastException)
   at OpenQA.Selenium.Support.UI.DefaultWait`1.Until[TResult](Func`2 condition)
   at OpenQA.Selenium.Appium.PageObjects.Interceptors.ElementInterceptor.getTarget(IInvocation ignored)
Result Message:	
OpenQA.Selenium.NoSuchElementException : Couldn't locate an element by these strategies: Locator map: 
- native content: "By.Id: <Digit5Btn>k__BackingField; " 
- html content: "ByIdOrName([<Digit5Btn>k__BackingField]); " 
  ----> OpenQA.Selenium.WebDriverTimeoutException : Timed out after 1 seconds

Link to Appium logs

https://gist.github.com/Ukrainis/82424f7dccc791e6362ad89f5f2fcdae

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions