gpt4 book ai didi

jquery-selectors - Selenium WebDriver PageFactory FindsBy 使用 jQuery 选择器?

转载 作者:行者123 更新时间:2023-12-01 01:22:57 24 4
gpt4 key购买 nike

为了解释我的问题,我给出了一个小场景:

假设我有一个登录页面。

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()

}

最终,我知道页面配置会改变,id 大部分会保持不变,但我的项目正在迅速变化。我知道 xPath 是另一种选择,但由于页面是基于某些标准生成的,这仍然会变得很痛苦,因为路径并不总是相同的。

使用上面的当前代码,页面被加载,并且 PageFactory 通过 Page Constructor 初始化元素。都很棒。这是我目前使用的。

目前,如果某些东西并不总是在页面上生成,直到某个步骤。我通常会做以下事情:
private const string ThisIsTheUserNameFieldId = "usernamefield";

然后使用以下命令打开 webdriver:
// Navigate to login page

// code here

// Enter in credentials

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

结构不如 PageFactory,但它肯定是我无法解决的要求。

我最近遇到了一些与 C#.Net 一起使用的 jQuery 选择器代码,它扩展了 RemoteWebDriver 的功能,我可以使用 jQuery 选择器在页面上找到我的元素。

Selenium jQuery for C#.Net (Including Source)
// So I can do things like this:
driver.FindElement(By.jQuery("a").Find(":contains('Home')").Next())

有谁知道我可以如何扩展 Selenium WebDriver 中的 [FindsBy] 属性,以便可以使用类似以下的内容(伪代码)?
[FindsBy(How = How.jQuery, Using = "div[id$='txtUserName']")]
public IWebElement UsernameField { get; set; }

最佳答案

这不扩展 [查找者] ,但您知道您可以使用 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");

您可以通过首先注入(inject) jquery(取自 JQuerify 并修改)轻松扩展它以允许 jquery 选择器:
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");

关于jquery-selectors - Selenium WebDriver PageFactory FindsBy 使用 jQuery 选择器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403217/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com