【问题标题】:C# Selenium fails to correctly assertC# Selenium 无法正确断言
【发布时间】:2021-07-08 10:26:22
【问题描述】:

下面的测试失败,说xpath 表达式不正确。我是按照网上教程做的。

// open browser
IWebDriver webDriver = new FirefoxDriver();
// navigate to site
webDriver.Navigate().GoToUrl("https://localhost:44311/");

// identify details button
IWebElement detailsLink = webDriver.FindElement(By.XPath("//*[contains(., 'Details')]"));

// operation
detailsLink.Click();

var detailsLabel = webDriver.FindElement(By.XPath("//div[text() = 'Change in $'"));

// assertion
Assert.That(detailsLabel.Displayed);

我想创建简单的 Selenium 测试。

  • 我正在按特定按钮打开新页面
  • 检查特定对象是否在该页面上正确加载

按钮是<a></a>,里面有Details。实际上有重复,唯一独特的是href。这可能是第一个问题,但我不知道如何“抓住”它。
detailsLabel 实际上是 <div>Change in $</div>class,我认为这与测试无关。
所以,我的问题是,如何正确编写这个测试?测试本身应该或多或少没问题,但detailsLinkdetailsLabel 有一定的问题。

编辑

IWebElement detailsLink = webDriver.FindElement(By.CssSelector("[href*='Details?cryptocurrency=BTC']"));

//operation
detailsLink.Click();

var detailsLabel = webDriver.FindElement(By.XPath("//div[contains(text(),'Change in $')]"));

detailsLink返回异常Selenium.StaleElementReferenceException

编辑

IWebElement detailsLink = webDriver.FindElement(By.CssSelector("[href*='Details?cryptocurrency=BTC']"));

detailsLink.Click();

var detailsLabel = webDriver.FindElement(By.XPath("//*[text()='Change in $```
Test fails at `detailsLabel`, fails to find our target `div`.

【问题讨论】:

  • 一旦点击detailsLink,它是导航到新的网址还是打开一个新的浏览器窗口?
  • @KunduK 成功打开网络浏览器,移动到detailsLink,但找不到div
  • @您是否提供了足够的等待来识别元素?
  • @KunduK 刚刚发现不需要询问,因为 Firefox 允许将 XPath 复制到任何元素。问题解决了。

标签: c# asp.net selenium


【解决方案1】:

要验证 //*[contains(., 'Details')] xpath 是否是唯一的,您可以执行类似的操作

List<WebElement>list = webDriver.FindElements(By.XPath("//*[contains(., 'Details')]"));

现在,如果 list 为空 - 这意味着您的定位器错误,如果它包含超过 1 个元素,则您的定位器不是唯一的。
但更好的方法是使用浏览器上的 F12 Inspector 工具在网页上手动直接验证这一点。
要定位包含一些 href 而没有特定 href 文本的元素,请使用 //href,以防 href 是元素标记。如果href 是一个属性,则使用//*[@href]
对于detailsLabel 尝试使用//div[contains(text(),'Change in')] xpath
我使用了Java 语法,但它与C# 足够相似

【讨论】:

  • 第一个失败。 Given xpath expression "css=a[href*='Details?cryptocurrency=BTC']" is invalid: SyntaxError: The expression is not a legal expression.感谢您的提示,我已经设法找到了直接的解决方案,但它失败了。
  • 尝试使用contains 而不是完全使用= 等式。 //a[contains(@href,'Details')]
  • 我想我已经修复了它,但现在它给了我例外。检查主帖。
  • 您需要在获取和单击该元素之前添加一些延迟。阅读Selenium.StaleElementReferenceException。这意味着元素在您对其执行detailsLink = webDriver.FindElement(By.CssSelector("[href*='Details?cryptocurrency=BTC']"));click() 之间发生了变化。
  • 好的。我终于明白了 Selenium 的意义。您不必做任何事情,因为点击是由 Selenium 本身完成的。傻我。但是,现在它在找不到 detailsLabel 元素上失败了。
猜你喜欢
  • 1970-01-01
  • 2018-07-12
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多