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