gpt4 book ai didi

c# - 在 C# 中使用 Selenium 时出现 "no such element"异常

转载 作者:行者123 更新时间:2023-11-30 16:57:22 27 4
gpt4 key购买 nike

我的 Web 项目“CalculatorWeb”中有一个网页,我在其中放置了一个 ID 为“txtNum1”的文本框

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<form id="frmCalc">
<div style="padding-top:20px;">
My Sample Text Box <br/><br/>
<input id="txtNum1" type="text" />
</div>
</form>
</body>
</html>

没什么特别的,所以页面加载如下

Web Page Preview

现在我为我的项目“Calculator.Specs”创建了一个功能文件“BrowserTest1.feature”。代码如下

Feature: BrowserTest1
In order to check url
As browser
I want to be see url of page

@mytag
Scenario: Go to URL
Given I have entered 'http://localhost:58529/'
When I go to that url
Then there is a text box on the page with id 'txtNum1'

然后我编写一个文件 BrowserTest.cs 用于单元测试实现

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using TechTalk.SpecFlow;

namespace Calculator.Specs
{
[Binding]
class BrowserTest
{

public string urlPath;


[Given(@"I have entered 'http://localhost:58529/'")]
protected void SetURL()
{
string URLPath = "http://localhost:58529/";
urlPath = URLPath;
}

[When(@"I go to that url")]
protected void NavigateToURL()
{
using (var driver = new ChromeDriver())
{
driver.Navigate().GoToUrl(urlPath);
}
}


[Then(@"there is a text box on the page with id 'txtNum1'")]
protected void TxtBoxExists()
{
bool txtExists = false;
using (var driver = new ChromeDriver())
{
IWebElement txtBox1 = driver.FindElement(By.Id("txtNum1"));

if (txtBox1 != null)
{
txtExists = true;
}
}
Assert.AreEqual(true, txtExists);
}
}
}

据我所知,我确实拥有 Visual Studio IDE 到 SpecFlow/Selenium 集成所需的所有引用资料

References Section

当我运行单元测试时,网页加载正常,但是当我尝试查找 ID 为“txtNum1”的元素时,即使页面上确实存在具有该 ID 的文本框,我的测试也失败了

Exception Message

异常详情显示如下

Exception Details

任何人都可以指出正确的方向,让 Selenium 能够找到 ID 为“txtNum1”的页面上的文本框,我缺少什么

最佳答案

您需要在步骤之间使用相同的驱动程序实例,否则导航到页面的驱动程序与您尝试从中获取元素的驱动程序不同。

你有几个选择。最简单的方法是为您的驱动程序实例创建一个字段并在所有步骤中使用该字段。只要您的所有步骤都在同一个文件中,这就会起作用。

另一种选择是将驱动程序对象存储在 ScenarioContext.Current(或 FeatureContext.Current)中。这些是字典,因此您可以这样做:

ScenarioContext.Current["webDriver"] = driver;

这可以正常工作,但是每次你得到驱动程序时你都必须转换,因为字典只接受对象,但是你可以在步骤之间共享你的驱动程序实例,不管它们在哪个文件中。

第三个(恕我直言,最好的)选项是创建一个 WebDriverContext 类,并在您的步骤类构造函数中接受它。在那里(在其构造函数中)创建您的驱动程序,然后每一步都可以使用 WebDriverContext 实例访问共享驱动程序。

可以在 answer here 中看到一个设置示例

关于c# - 在 C# 中使用 Selenium 时出现 "no such element"异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26736826/

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