【问题标题】:Xpath Contains with a variableXpath 包含一个变量
【发布时间】:2017-11-03 05:48:38
【问题描述】:

我为此绞尽脑汁已经有一段时间了,但似乎无法弄清楚。我希望在我的雅虎帐户中点击一封电子邮件。如果我指定我要查找的内容的值,它可以在第一封电子邮件中查找。我需要能够根据主题找到任何电子邮件。 如果第一个主题包含“POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE”,则可以单击该主题

wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE')]"))).click();

另一方面,如果我将其设为变量,则它不会:

String emailtitle = "POST/EDIT/DELETE: "+ "*2007 NO DAMAGE TOYOTA CAMRY XLE";//Build email string
System.out.println("Email Title is: "+ emailtitle);
wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'" + emailtitle + "')]"))).click();

我在哪里搜索:​​

<div class="subj" role="gridcell" id="yui_3_16_0_ym19_1_1509685997190_1725"> <span dir="" class="subject " title="POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE ( cars &amp; trucks - by owner)" id="yui_3_16_0_ym19_1_1509685997190_1724"> POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE ( cars &amp; trucks - by owner) </span>  <span class="thread-snippet" role="gridcell" dir="" id="yui_3_16_0_ym19_1_1509685997190_1754"> IMPORTANT - FURTHER ACTION IS REQUIRED TO COMPLETE YOUR REQUEST !!! FOLLOW THE WEB ADDRESS BELOW TO: PUBLISH YOUR AD EDIT (OR CONFIRM AN EDIT TO) YOUR AD VERIFY YOUR EMAIL ADDRESS DELETE YOUR AD If not clickable, please copy and paste the address to your browser: THIS LINK IS A PASSWORD. DO NOT SHARE IT - anyone who has a copy of this link can edit or delete your posting. link PLEASE KEEP THIS EMAIL - you may need it to manage your posting! Your posting </span>  </div>

理想情况下,我希望能够根据电子邮件标题更改电子邮件标题。所以使用变量是必须的。但是由于某种原因,当我将它用作变量时,它不会返回值。发生这种情况有什么原因吗?

【问题讨论】:

  • 你的第一个代码块有两次POST/EDIT/DELETE:,所以这根本不应该工作。
  • 是的,我的要求是根据邮件的标题点击邮件。
  • 不要把emailtitle放在双引号下,因为它是字符串,不带引号的保留它并检查By.xpath("//*[contains(text(),emailtitle)]"))跨度>
  • @ShoaibAkhtar 这没有任何意义。 emailtitle 是 Java 局部变量。 XPath 引擎无权访问它。
  • @Andreas 它应该可以工作。我想我之前已经尝试过了。让他试试这个 By.xpath("//*[contains(text(),emailtitle)]"))

标签: java selenium firefox xpath


【解决方案1】:
  1. 尽量保持String emailtitle 简单:

    String emailtitle = "POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE";
    
  2. 而不是:

    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'" + emailtitle + "')]"))).click();
    

    你可以试试:

    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[.='" + emailtitle + "']")));
    
  3. wait 将返回找到的元素。因此,请借助 WebElement 并在下一步中调用 click()

    WebElement elem = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[.='" + emailtitle + "']")));
    elem.click();
    

【讨论】:

  • 无法使用 By.xpath 定位元素://*[.='POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE']
  • 引起:org.openqa.selenium.NoSuchElementException:无法使用 By.xpath 定位元素://div[.='POST/EDIT/DELETE: *2007 NO DAMAGE TOYOTA CAMRY XLE']
  • 因为 contains 是必须在这里
  • @Kabone 告诉我wait的定义
  • WebDriverWait 等待 = new WebDriverWait(driver, 8);
【解决方案2】:

试试这个

String emailtitle = "POST/EDIT/DELETE: "+ "*2007 NO DAMAGE TOYOTA CAMRY XLE";//Build email string
System.out.println("Email Title is: "+ emailtitle);   
wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[text(),emailtitle]")));  
driver.findElement(By.xpath("//*[text(),emailtitle]")).click();

如果您的 xpath 返回多个元素,请尝试根据索引搜索您的特定元素,例如

...By.xpath("
(//*[text(),emailtitle]")[1]).click()//try with different like 0,1,2

如下图所示,我的 xpath 返回了 7 个匹配项,因此通过索引我尝试获取我的特定元素,然后在使用新的 xpath 后我可以单击该元素

【讨论】:

  • 无法使用 By.xpath 定位元素://*[.=emailtitle]
  • 我尝试遍历找到的元素并单击,但仍然没有找到它:( 我决定尝试获取我正在循环的每个元素的文本并设法让其中一个元素返回 - POST /编辑/删除:* 2007 NO DAMAGE TOYOTA CAMRY XLE(汽车和卡车 - 所有者)但它没有选择它。
  • 正如@sagar007 所建议的,当元素可见时单击,而不是当元素可单击时单击,因为文本是跨度的。我已经基于此更新了我的答案。请检查,它现在应该可以工作了。
【解决方案3】:

最好避免使用字符串连接构造 XPath 表达式。充其量,由于与引号纠缠不清,您可能会遇到像这样的调试麻烦,以及由于每次执行表达式时都重新编译表达式而导致的性能问题。最坏的情况是,您的代码容易受到注入攻击。

从您问题中的标签中我不太确定您使用的是什么 XPath API,但大多数 XPath API 允许您编译包含变量引用的表达式:

x = xpath.compile("//something[contains(@att, $value)]");

然后在执行时为参数提供一个值,例如:

y = x.load();
y.setParam("value", theValueIAmLookingFor)
y.evaluate();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-22
    • 2021-05-19
    • 2020-06-03
    • 2011-11-24
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多