如何使用AND运算符编写XPath以在单个XPath中添加多个范围?

时间:2019-01-03 12:34:06

标签: java selenium selenium-webdriver xpath webdriver

该页面包含一个产品名称-(3之3)GLOWEN GLOW(DELUXE)。 产品名称有6个不同的跨度,因此我们要打印产品名称“ GOLDEN GLOW(DELUXE)”,即包括所有跨度,因此我尝试在[]中使用和多次,但没有用。下面是XPath:

//*[@class='itemTitleCopy no-mobile' and contains(@class, 'no-mobile') and contains(@class, 'sizeDescriptionTitle no-mobile') contains(@class, 'no-mobile') ]

下面是HTML代码:

<span class="m-shopping-cart-item-header-number">
   ( 
   <span id="itemNo-1" class="itemNo">3</span>
   of 
   <span id="totalItems-1" class="totalItems">3</span>
   )
   <span class="itemTitleCopy no-mobile" id="itemTitleCopy-1">Golden Glow</span>
   <span class="no-mobile">(</span>
   <span class="sizeDescriptionTitle no-mobile" id="sizeDescriptionTitle-1">Deluxe</span>
   <span class="no-mobile">)</span>
</span>

更新

代码试用:

WebElement checkoutShippingProdName = new WebDriverWait(getDriver(), 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//span[@class='m-shopping-cart-item-header-number']"))); 
String shipProdElementHtml = checkoutShippingProdName.getAttribute("innerHTML"); 
String[] shipProdElementHtmlHtmlSplit = shipProdElementHtml.split("span>"); 
String currentProd = shipProdElementHtmlHtmlSplit[shipProdElementHtmlHtmlSplit.length -1]; 
currentProd = StringEscapeUtils.unescapeHtml4(StringUtils.trim(currentProd)); 
System.out.println("The Product Name is:" + currentProd);

5 个答案:

答案 0 :(得分:2)

'//span[@class="totalItems"]/following-sibling::span'

应选择spanspan之后的所有class="totalItems"节点。取决于硒绑定,提取所需文本内容的方法可能有所不同。

这是获取所需输出的Python代码:

text = " ".join([span.text for span in driver.find_elements_by_xpath('//span[@class="totalItems"]/following-sibling::span')])
print(text)
#  'Golden Glow(Deluxe)'

答案 1 :(得分:2)

正如@Michael Kay回答的那样,您需要使用or运算符!

您可以使用findElements硒来做到这一点。

它应该看起来像这样:

driver.findElements(By.xpath("//*[@class='itemTitleCopy no-mobile' or contains(@class, 'no-mobile') or contains(@class, 'sizeDescriptionTitle no-mobile')]"))

这将返回WebElements的列表,现在您可以遍历它们并结合文本以创建所需的字符串"GOLDEN GLOW ( DELUXE )"

所有功劳都归功于@Michael Kay,我只是为您提供示例...

答案 2 :(得分:1)

您似乎对andor的含义感到困惑。谓词中的and运算符意味着两个条件都必须为真:它的限制性更强,因此通常选择的数据更少。 or运算符表示任何一个条件都必须为真:它更宽松,因此将选择更多数据。

您似乎在想“和”的意思是“联合”-选择X和(同时选择)Y。这在布尔逻辑中从来就没有意义。

答案 3 :(得分:0)

使用此:

//*[@class=('itemTitleCopy no-mobile','sizeDescriptionTitle no-mobile','no-mobile')]

希望它能解决。

答案 4 :(得分:0)

要提取文本 Glowen Glow(Deluxe),您可以使用以下Locator Strategy

  • 使用 XPath

    String myString = driver.findElement(By.xpath("//span[@class='m-shopping-cart-item-header-number']")).getText();
    String[] parts = myString.split("?<=)");
    System.out.println(parts[1]);