【问题标题】:C# / Selenium - failing to find XPath text using contains()C#/Selenium - 使用 contains() 找不到 XPath 文本
【发布时间】:2021-04-03 23:21:54
【问题描述】:

我有一个我希望使用 Selenium 点击的 html 元素:

<a class="epi-navigation-global_user_settings_shell_search " href="DatabaseJob.aspx?pluginId=20">
                                            Importer obligationsliste
                                        </a>

使用以下 xpath:/html/body/form/div[4]/div[1]/div/ul/li[2]/ul/li[19]/a

我尝试通过以下表达式单击包含文本 "Importer obligationsliste" 的元素:

var obligationButton = By.XPath("//a[contains(text(), 'Importer')]");
wait.Until(ExpectedConditions.ElementToBeClickable(obligationButton)).Click();

然而,该元素从未被发现。我也尝试了完整的字符串 Importer obligationsliste 无济于事。 任何想法为什么找不到该元素?我怀疑它与文本周围的空白有关,但contains() 也应该能够找到子字符串。

【问题讨论】:

  • 是aniframe里面的elemtn
  • @PDHide 不,只是一个常规元素。

标签: c# selenium selenium-webdriver xpath webdriverwait


【解决方案1】:

请转至https://www.w3schools.com/xml/xpath_intro.asp 并阅读有关编写 xpath 的信息。从 Chrome 抓取路径是您能做的最糟糕的事情。这些路径需要更长的时间才能找到并且非常脆弱。在开发更改中添加 div、ul 或 li,您的路径将中断。

如果它不在 iframe 中,请尝试以下操作:

//a[contains(text(), 'Importer obligationsliste')]
//a[normalize-space()='Importer obligationsliste']

【讨论】:

  • 我没有使用那个 XPath,我只是发布它来显示我正在寻找的实际元素的位置。
  • 你是对的,它确实是一个 iframe,只是到目前为止我没有意识到。谢谢!
【解决方案2】:

Importer dutyliste 文本有很多前导和尾随空格。因此,对于元素上的Click(),您必须为所需的ElementToBeClickable() 诱导WebDriverWait,您可以使用以下任一Locator Strategies

  • XPathcontains() 一起用于文本 Importer dutyliste

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//a[contains(., 'Importer obligationsliste')]"))).Click();
    
  • XPathnormalize-space() 一起用于文本 Importer dutyliste

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//a[normalize-space()='Importer obligationsliste']"))).Click();
    
  • 使用XPath

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.XPath("//a[@class='epi-navigation-global_user_settings_shell_search ' and starts-with(@href, 'DatabaseJob')]"))).Click();
    
  • 使用PartialLinkText

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.PartialLinkText("Importer obligationsliste"))).Click();
    
  • 使用CssSelector

    new WebDriverWait(driver, TimeSpan.FromSeconds(20)).Until(ExpectedConditions.ElementToBeClickable(By.CssSelector("a.epi-navigation-global_user_settings_shell_search[href^='DatabaseJob']"))).Click();
    

【讨论】:

  • 您好 DebanjanB,感谢您的帮助。不幸的是,所提出的解决方案都没有成功获得该元素。就好像该元素根本不存在。
猜你喜欢
  • 2013-05-21
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多