A quick fix is to create a CssSelector to access your element as follows: Driver.FindElement(By.CssSelector("a[ng-click='buttonOnClick($event)']"));
A good solution is to create a class for each page you are testing and reach the elements of your page as follows:
class LoginPageObject
{
public LoginPageObject()
{
PageFactory.InitElements(TestBase.driver, this);
}
[FindsBy(How = How.Id, Using = "UserName")]
public IWebElement TxtUsername { get; set; }
[FindsBy(How = How.Id, Using = "Password")]
public IWebElement TxtPassword { get; set; }
[FindsBy(How = How.Id, Using = "submit")]
public IWebElement BtnLogin { get; set; }
}
Angular, ng, Protractor-Net, NgBy Angular DOM, :
var ngDriver = new NgWebDriver(driver);
ngDriver.Navigate().GoToUrl("http://www.angularjs.org");
var elements = ngDriver.FindElements(NgBy.Repeater("todo in todoList.todos"));
. , Angular API- , :
public class NgByRepeaterFinder : By
{
public NgByRepeaterFinder(string locator)
{
FindElementsMethod = context => context.FindElements(NgBy.Repeater(locator));
}
}
internal class NgByModelFinder : By
{
public NgByModelFinder(string locator)
{
FindElementMethod = context => context.FindElement(NgBy.Model(locator));
}
}
:
class YourPageObject
{
public YourPageObject()
{
PageFactory.InitElements(TestBase.ngWebDriver, this);
}
[FindsBy(How = How.CssSelector, Using = "a[ng-click='addNewTrack()']")]
public IWebElement BtnAddNewTrack { get; set; }
[FindsBy(How = How.Custom, CustomFinderType = typeof(NgByModelFinder), Using = "trackSearch")]
public IWebElement TxtSearchTrack { get; set; }
[FindsBy(How = How.Custom, CustomFinderType = typeof(NgByRepeaterFinder), Using = "track in models.tracks | filter: trackSearch")]
public IList<IWebElement> BtnListTracks { get; set; }
}
angularjs .