Как получить сумму цены без страйка в селене, используя xpath?

Когда я пытаюсь разделить поведение между двумя тесно связанными классами, я создаю абстрактный класс, который содержит общее поведение и служит родителем для обоих классов.

Когда я пытаюсь определить тип , список методов, которые пользователь моего объекта может надежно вызвать, затем я создаю интерфейс.

Например, я бы никогда не создал абстрактный класс с 1 конкретным подклассом, потому что абстрактные классы касаются поведения совместного использования. Но я вполне мог бы создать интерфейс только с одной реализацией. Пользователь моего кода не будет знать, что существует только одна реализация. Действительно, в будущей версии может быть несколько реализаций, все из которых являются подклассами какого-то нового абстрактного класса, который даже не существовал, когда я создал интерфейс.

Это могло показаться слишком слишком книжным (хотя я никогда не видел, чтобы это было так, как я помню). Если бы интервьюер (или ОП) действительно хотел больше моего личного опыта по этому поводу, я был бы готов с анекдотами интерфейса, которые развивались по необходимости и наоборот.

Еще одна вещь. Теперь Java 8 позволяет поместить код по умолчанию в интерфейс, еще больше размывая границу между интерфейсами и абстрактными классами. Но из того, что я видел, эта функция слишком часто используется разработчиками ядровых библиотек Java. Эта функция была добавлена, и это правильно, чтобы было возможно расширить интерфейс без создания двоичной несовместимости. Но если вы создаете новый тип, определяя интерфейс, тогда интерфейс должен быть просто интерфейсом. Если вы хотите также предоставить общий код, то обязательно создайте вспомогательный класс (абстрактный или конкретный). Не запутывайте свой интерфейс с самого начала с функциональностью, которую вы можете изменить.

-1
задан DebanjanB 29 March 2019 в 16:26
поделиться

4 ответа

Цена без зачеркивания, т. Е. Текст $ 20,00 является текстовым узлом , и для получения текста можно использовать следующее решение:

  • Java решение:

    WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//div[@class='course row']//div[contains(@class, 'price')]")));
    String myText = ((JavascriptExecutor)driver).executeScript("return arguments[0].lastChild.textContent;", element).toString();
    System.out.println(myText);
    
  • Консольный вывод:

    $ 20.00
    
0
ответ дан DebanjanB 29 March 2019 в 16:26
поделиться

Трудно понять, как ответить на ваш вопрос без каких-либо подробностей, на странице есть несколько элементов, у которых есть количество зачеркнутых / непроходных.

Для общего решения вы можете использовать следующее: оно будет соответствовать нескольким блокам, которые имеют цены. Если вы хотите что-то более целенаправленное, вам понадобится немного более сложный локатор, который определяет товар, а также ценовой блок. Если вам нужен только первый ценовой блок на странице, это будет работать:

//*[contains(@class,'price')]

Это то же самое, что и следующий CSS-селектор (который гораздо менее сложен)

.price

Однако разметка будет вызывать проблемы, она выглядит следующим образом:

<div class="col-md-3 col-sm-4 price">
    <del style="font-size:15px;color:#aaa">$ 85.00</del>
    <br>
    $ 20.00
</div>

В строгом XPath вы можете сделать это, используя XPath вроде:

//*[contains(@class,'price')]/text()

Однако Selenium не позволяет вам связать текстовый узел в WebElement. Это означает, что хотя вышеуказанный Xpath будет работать непосредственно в браузере, он не будет работать как локатор для поиска WebElement (поскольку он не находит элемент, он находит текстовый узел).

Лучший способ это исправить - поднять ошибку и заставить разработчика размещать количество, которое не вычеркнуто, в его собственный элемент (например, обернуть его <span>).

В качестве хакерского обходного пути вы можете попробовать получить внутренний HTML-код элемента следующим образом:

WebElement price = driver.findElement(By.cssSelector(".price"));
String elementHTML = price.getAttribute("innerHTML");

Элемент StringHTML будет содержать следующее:

<del style="font-size:15px;color:#aaa">$ 85.00</del>
<br>
$ 20.00

Вы затем нужно будет проанализировать строку, чтобы удалить первые две строки (хотя это не очень хорошее и надежное решение).

0
ответ дан Ardesco 29 March 2019 в 16:26
поделиться
xpath=//section[@id='content']/div/div/div/div/div/div[2]/div/div[2]
0
ответ дан Muhammed Gül 29 March 2019 в 16:26
поделиться

Вот метод в Python, который будет получать только цену ($ 20,00). Примечание: это будет работать не в тех случаях, когда у вас есть цена поражена или нет.

def get_text_exclude_children(element):
    return driver.execute_script(
        """
        var parent = arguments[0];
        var child = parent.firstChild;
        var textValue = "";
        while(child) {
            if (child.nodeType === Node.TEXT_NODE)
                    textValue += child.textContent;
                    child = child.nextSibling;
        }
        return textValue;""",
        element).strip()

Как использовать здесь.

element = driver.find_element_by_xpath("(//div[@class='col-md-3 col-sm-4 price'])[1]")
price = get_text_exclude_children(element)
0
ответ дан supputuri 29 March 2019 в 16:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: