Как написать XPath с использованием оператора AND для добавления нескольких диапазонов в одном XPath? - PullRequest
0 голосов
/ 03 января 2019

На странице содержится Название продукта - (3 из 3) ЗОЛОТОЙ СВЕТ (ДЕЛЮКС). Название продукта имеет 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 голосов
/ 03 января 2019

Как ответил @Michael Kay, вам нужно использовать оператор or

Вы можете сделать это с findElements Selenium.

Это должно выглядеть примерно так:

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. Я только что привел вам пример ...

0 голосов
/ 03 января 2019

Вы, кажется, смущены значением and и or. Оператор and в предикате означает, что оба условия должны выполняться: оно более ограничительно, поэтому в общем случае будет выбрано меньше данных. Оператор or означает, что любое условие должно быть выполнено: оно более либерально, поэтому будет выбрано больше данных.

Похоже, вы думаете о «и» как о значении «союз» - выберите X и (также выберите) Y. Это никогда не имеет смысла в булевой логике.

0 голосов
/ 03 января 2019

Для извлечения текста Golden Glow (Deluxe) вы можете использовать следующую Стратегию локатора :

  • Использование 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]);
    
0 голосов
/ 03 января 2019
'//span[@class="totalItems"]/following-sibling::span'

должен выбрать все span узлы после span с class="totalItems". Могут быть разные подходы к извлечению необходимого текстового содержимого в зависимости от привязки Selenium.

Это код Python для получения требуемого вывода:

text = " ".join([span.text for span in driver.find_elements_by_xpath('//span[@class="totalItems"]/following-sibling::span')])
print(text)
#  'Golden Glow(Deluxe)'
0 голосов
/ 03 января 2019

Используйте это:

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

Надеюсь, что это решит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...