Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Xpath包含一个变量_Java_Selenium_Firefox_Xpath - Fatal编程技术网

Java Xpath包含一个变量

Java Xpath包含一个变量,java,selenium,firefox,xpath,Java,Selenium,Firefox,Xpath,这件事让我绞尽脑汁已经有一段时间了,但似乎还没弄明白。。我期待着在我的雅虎帐户内点击电子邮件。若我指定要查找的内容的值,它将在第一封电子邮件中查找。我需要能够找到任何基于该主题的电子邮件。 如果第一个主题包含“POST/EDIT/DELETE:*2007无损坏丰田凯美瑞XLE”,则可单击该主题 另一方面,如果我将其设为变量,则它不会: String emailtitle = "POST/EDIT/DELETE: "+ "*2007 NO DAMAGE TOYOTA CAMRY XLE";//Bu

这件事让我绞尽脑汁已经有一段时间了,但似乎还没弄明白。。我期待着在我的雅虎帐户内点击电子邮件。若我指定要查找的内容的值,它将在第一封电子邮件中查找。我需要能够找到任何基于该主题的电子邮件。 如果第一个主题包含“POST/EDIT/DELETE:*2007无损坏丰田凯美瑞XLE”,则可单击该主题

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

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:*2007无损坏丰田凯美瑞XLE(轿车和卡车-由车主提供)重要-需要采取进一步行动来完成您的请求!!!按照以下网址:发布您的广告编辑(或确认编辑)您的广告验证您的电子邮件地址删除您的广告如果无法单击,请将地址复制并粘贴到浏览器:此链接是密码。不要共享-任何拥有此链接副本的人都可以编辑或删除您的帖子。链接请保留此电子邮件-您可能需要它来管理您的发布!你的帖子
理想情况下,我希望能够有emailtitle的更改基于电子邮件的标题。因此,必须使用变量。但由于某种原因,当我将其用作变量时,它不会返回值。这有什么原因吗

  • 尽量使
    字符串
    电子邮件标题
    简单如下:

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

    wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//*[contains(text(),'" + emailtitle + "')]"))).click();
    
    您可以尝试:

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

    WebElement elem = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//span[.='" + emailtitle + "']")));
    elem.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.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后,我可以单击该元素
    最好避免使用字符串连接构造XPath表达式。充其量,您可能会遇到类似这样的调试麻烦,因为它与引号纠缠在一起,性能问题是因为您每次执行表达式时都要重新编译它。最坏的情况是,您的代码容易受到注入攻击

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

    x = xpath.compile("//something[contains(@att, $value)]");
    
    然后在执行时为参数提供一个值,类似于:

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

    您的第一个代码块中有两次文本
    POST/EDIT/DELETE:
    ,因此这根本不起作用。是的,我的要求是根据电子邮件的标题单击电子邮件。不要将emailtitle放在双引号下,因为它是字符串,请将其保留在不带引号的位置,并通过.xpath(//*[包含(text(),emailtitle)]进行检查)@这毫无意义
    emailtitle
    是一个Java局部变量。XPath引擎无权访问它。@Andreas它应该可以工作。我想我早就试过了。让他试一下。xpath(“/*[contains(text(),emailtitle)])无法使用By.xpath查找元素:/*[.='POST/EDIT/DELETE:*2007丰田凯美瑞XLE无损坏]:org.openqa.selenium.NoSuchElementException:无法使用By.xpath://div查找元素[.='POST/EDIT/DELETE:*2007丰田凯美瑞XLE无损坏]因为包容是必须的here@Kabone显示
    wait
    WebDriverWait wait=newwebdriverwait(驱动程序,8)的定义;无法使用By.xpath://*[.=emailtitle]定位元素我尝试循环查找到的元素并单击,但仍然没有找到它:(我决定尝试获取循环中的每个元素的文本,并设法让其中一个元素返回-POST/EDIT/DELETE:*2007无损坏丰田凯美瑞XLE(汽车和卡车-由车主提供)但它没有选择它。正如@sagar007所建议的,当元素可见时单击,而不是当元素可单击时单击,因为在您的案例中,文本是span。我已根据此更新了我的答案。请检查,它现在应该可以工作了。
    y = x.load();
    y.setParam("value", theValueIAmLookingFor)
    y.evaluate();