Selenium WebDriver PageFactory FindSBy С помощью jQuery Selector? - PullRequest
4 голосов
/ 06 декабря 2011

Чтобы объяснить мой вопрос, я привел небольшой сценарий:

Допустим, у меня есть страница входа.

public class LoginPage
{
    [FindsBy(How = How.Id, Using = "SomeReallyLongIdBecauseOfAspNetControlsAndPanels_username"]
    public IWebElement UsernameField { get; set; }

    [FindsBy(How = How.Id, Using = "SomeReallyLongIdBecauseOfAspNetControlsAndPanels_password"]
    public IWebElement PasswordField { get; set; }

    [FindsBy(How = How.Id, Using = "submitButtonId")]
    public IWebElement SubmitButton { get; set; }

    private readonly IWebDriver driver;

    public LoginPage(IWebDriver driver)
    {
        this.driver = driver;

        if(!driver.Url.Contains("Login.aspx"))
        {
            throw new NotFoundException("This is not the login page.");
        }
        PageFactory.InitElements(driver, this);
    }

    public HomePage Login(Credentials cred)
    {

       UsernameField.sendKeys(cred.Username);
       PasswordField.SendKeys(cred.Password);
       SubmitButton.Click();

       return new HomePage(driver);
    }

}

[TestFixture]
public class Test : TestBase
{
    private IWebDriver driver;

    [SetUp]
    public void SetUp()
    {

       driver = StartDriver(); // some function which returns my driver in a wrapped event or something so I can log everything it does.
    }

    [Test]
    public void Test()
    {
        new LoginPage(driver)
                .Login(new Credentials 
                           { Username = "username", 
                             Password = "password" })
                .SomeHomePageFunction()

    }

В конце концов, я знаю, что конфигурация страницы изменится, идентификатор будетв основном остаются такими же, но все быстро меняется в моих проектах.Я знаю, что xPath - это еще одна альтернатива, но из-за того, как страницы генерируются на основе определенных критериев, это все равно станет болезненным, поскольку путь не всегда будет одинаковым.

С текущим кодом, приведенным выше, страницазагрузил и PageFactory инициализирует элементы через конструктор страниц.Все здорово.Это то, что я использую в данный момент.

В настоящее время, если некоторые вещи не всегда генерируются на странице до определенного шага.Я обычно делаю следующее:

private const string ThisIsTheUserNameFieldId = "usernamefield";

Затем запускаю веб-драйвер, используя следующее:

// Navigate to login page

// code here

// Enter in credentials

driver.FindElement(By.Id(ThisIsTheUserNameFieldId)).SendKeys(cred.Username);

Не так хорошо структурирован, как PageFactory, но это, безусловно, требование, которого я не придерживаюсьсмог обойтись.

Недавно я натолкнулся на некоторый код jQuery Selector для использования с C # .Net, который расширяет функциональность RemoteWebDriver, где я могу использовать селекторы jQuery для поиска своих элементов на странице.

Selenium jQuery для C # .Net (включая источник)

// So I can do things like this:
driver.FindElement(By.jQuery("a").Find(":contains('Home')").Next())

Кто-нибудь знает, как я могу расширить атрибут [FindsBy] в Selenium WebDriver, чтобы это было возможноиспользовать что-то вроде следующего (псевдокод)?

[FindsBy(How = How.jQuery, Using = "div[id$='txtUserName']")]
public IWebElement UsernameField { get; set; }

1 Ответ

4 голосов
/ 06 декабря 2011

Это не распространяется [FindsBy] , но знаете ли вы, что можете использовать элементы, возвращаемые javascript?:

var driver = new FirefoxDriver { Url = "http://www.google.com" };
var element = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript("return document.getElementsByName('q')[0];");
element.SendKeys("hello world");

Вы можете легко расширить это, чтобы включить селекторы jqueryсначала введя jquery (взято из JQuerify и изменено):

const string js =
     @"{var b=document.getElementsByTagName('body')[0]; if(typeof jQuery=='undefined'){var script=document" +
     @".createElement('script'); script.src='http://code.jquery.com/jquery-latest.min.js';var head=document" +
     @".getElementsByTagName('head')[0],done=false;script.onload=script.onreadystatechange=function(){if(!" +
     @"done&&(!this.readyState||this.readyState=='loaded'||this.readyState=='complete')){done=true;script." +
     @"onload=script.onreadystatechange=null;head.removeChild(script);}};head.appendChild(script);}}";
((IJavaScriptExecutor)driver).ExecuteScript(js);

А затем запустите javascript, чтобы выбрать нужный элемент:

var driver = new FirefoxDriver { Url = "http://www.google.com" };
var element = (IWebElement)((IJavaScriptExecutor)driver).ExecuteScript(@"return $('input[name*=""q""]')[0];");
element.SendKeys("hello world");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...