繁体   English   中英

C# / Selenium - 使用 contains() 找不到 XPath 文本

[英]C# / Selenium - failing to find XPath text using contains()

我有和 html 元素,我希望使用 Selenium 点击:

<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 dutyliste 无济于事。 任何想法为什么找不到该元素? 我怀疑它与文本周围的空白有关,但contains()也应该能够找到子字符串。

文本Importer dutyliste有很多前导和尾随空格。 因此,要在元素上Click() ,您必须为所需的ElementToBeClickable()诱导WebDriverWait ,并且您可以使用以下任一定位器策略

  • 使用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();

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM