gpt4 book ai didi

c# - Selenium点击按钮功能

转载 作者:行者123 更新时间:2023-11-29 10:19:50 24 4
gpt4 key购买 nike

 /// <summary>
/// clicks on an element given the elements ID and a waiting timeout
/// </summary>
/// <param name="driver"></param>
/// <param name="ID"></param>
/// <param name="timeout"></param>
public static void clickElement(IWebDriver driver, String ID, int timeout)
{
try
{
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(timeout));
wait.Until(ExpectedConditions.ElementToBeClickable(By.Id(ID)));
driver.FindElement(By.Id(ID)).Click();
}
catch (NoSuchElementException)
{
MessageBox.Show("On Selenium Action click " + ID + " after 10 seconds, this button didn't appear on the page", "Use Case 1 Failure", MessageBoxButtons.OK, MessageBoxIcon.Error);
throw;
}
catch (TimeoutException)
{
MessageBox.Show("After waiting for 10 seconds, the page was not loaded !", "Use case Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

我试图让这个函数区分我想要捕获的两种类型的异常,即页面未加载或按钮不存在(ID已更改或按钮已被删除)。

最佳答案

TimeoutException 可能表明单击操作未正确返回 - 这被视为驱动程序超时。例如:您单击提交按钮,服务器正在处理请求 5 分钟,但驱动程序超时为 60 秒 - 因此超时。

您似乎正在遵守使用静态方法的约定,很可能是在函数库中。我不鼓励这种方法 - 因为它是面向对象的反模式。

在我们自己的测试框架中,我们有专门的类型来封装 Selenium 提供的 IWebElement 类/接口(interface),并将我们自己的功能置于其之上。

所以不要打电话

IWebElement textbox = Driver.FindElement(By.Id("username"));
textbox.TypeKeys("Administrator");

我们打电话

Textbox mytextbox = new Textbox(By.Id("username"));
mytextbox.SetText("Administrator");

如果需要,Textbox 类的构造函数将执行存在性检查(或不存在性检查)。

此外 - 我们还有另一个专门的接口(interface)/类,称为“IPage/Page”它实现了 IDisposable,因此我们可以在 using() 语句的上下文中利用页面对象模型。

例如:

using(LoginPage page = new LoginPage())
{
page.UsernameTextBox().SetText("Administrator");
page.PasswordTextBox().SetText("Password12121212");
page.SubmitButton().Click();
}

通过将 IDisposable 与页面模型方法结合使用,您可以使 LoginPage 类的构造函数知道在登录页面本身的特定对象上进行同步。例如:当 LoginPage 类实例化时,我们检查 UsernameTextBox 是否存在 - 如果不存在,则页面未正确加载,因此执行 using 语句的内容没有意义。

我通常建议将同步对象设置为预计在每页屏幕上加载的最后一个对象。通过这种方式,您可以让代码智能地等待页面加载,然后再进入 using 语句的内部上下文。

使用这种方法,您可以检测页面是否加载失败,或者对象是否加载失败。我们不要忘记,页面可以加载,但由于被测应用程序的数据或代码问题,页面仍然是错误的。这是 TimeoutException 无法捕获的场景。

我们在框架中遵循的典型结构是 - 以防万一您想要对类似的东西进行建模。

BaseElement - 将 IWebElement 作为私有(private)字段 - 所有工作都在 IWebElement 上完成。BaseElement 将在此级别定义和实现大部分功能,作为适当的 protected 或公共(public)方法。

然后,我们在定义其他专用类时扩展/继承 BaseElement。例如:ButtonLink、Textbox、DropdownSelects、RadioCheckboxes 等

我们在适当的情况下重写方法,或者简单地将调用重定向到 BaseElement 中的基本方法。

我们以这种方式设计框架的理由是基于“并非每个网络元素都是文本框,那么为什么要这样对待它?”的逻辑。情况是这样的——如果相关对象实际上是一个下拉菜单,我们只会获得下拉菜单的智能感知/选项。

在 .Net 编码/编程中 - 强类型化您的类通常是一个鼓励的原则 - 因此像对待所有其他类型的类一样对待所有内容 - 即使 Selenium 或更广泛的 QA 社区允许/鼓励它,也不一定是一个好主意。在基本 Selenium 类型之上构建一个框架将允许您处理需要使用 Javascript 单击按钮或需要从 Highchart 图表中获取数据等的定制场合

抱歉,我的咆哮 - 我只是认为这可能是一个值得深思的问题,也是解决您问题的另一种方法。

关于c# - Selenium点击按钮功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49493703/

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