Selenium Python, отправьте числовое входное значение в li в формате HTML

#python #selenium

Вопрос:

Я автоматизирую скрипт, который выбирает количество продукта, но на этом конкретном сайте используются кнопки /- щелчок и нет выпадающего списка или поля ввода для количеств, считываемых из CSV.

Вместо того, чтобы имитировать нажатия кнопок /- для количеств, вы можете вручную отредактировать приведенный ниже HTML-код с нужным номером и нажать кнопку «Добавить в корзину» для того же эффекта.

Можно ли редактировать HTML, когда на сайте нет формы для этого? Или мне нужно эмулировать клики для нужного количества. Я использую Pandas для чтения CSV и работаю с кодом из другого проекта.

Спасибо, если вы можете помочь

 https://www.matsukiyo.co.jp/store/online/p/4902888248269

<ul class="count">
        <li>数量</li>
        <li class="minus disable"><a href="#">-</a></li>
        <li class="num" id="addToCartQty" data-code="99">1</li>
        <li class="plus"><a href="#">+</a></li>
        </ul>
 

Вы можете изменить значение data-code="99">1</li> с 1 на 99, и оно обновится, но возможно ли это в Selenium, так как я не могу найти правильный селектор для этого. У меня такое чувство, что это невозможно?

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

Как я могу отправить значение из CSV, чтобы указать количество кликов? Или как я могу записать значение в HTML li?

 driver.get(web_url str(UPC[i]))
try:
    driver.find_element(By.LINK_TEXT, "+").click
    # I want to add the number of clicks here(str(quantity[i]))
    link = driver.find_element_by_css_selector("p.button.cart")
    link.click()
except:
    print("Product Number: " str(UPC[i]) " Sold Out!")
 

Ответ №1:

Как я вижу, элемент, содержащий счетчик, расположен по идентификатору=’addToCartQty’, так что вы можете просто

 driver.find_element_by_css_selector('#addToCartQty').sendKeys("your value");
 

или

 driver.find_element_by_css_selector('#addToCartQty').sendKeys("value", "your value");

 

или

 element = driver.find_element_by_css_selector('#addToCartQty')
JavascriptExecutor jse = (JavascriptExecutor)driver;
jse.executeScript("arguments[0].value='enter the value here';", element);
 

Не подделывайте, чтобы изменить «ваше значение» или «введите значение здесь» с номером, который вы хотите ввести там.

Комментарии:

1. Спасибо за ответ, к сожалению, поскольку addToCartQty не является выбираемым элементом на веб-странице, клавиши отправки не обновляют значение в li, и операция не выполняет числовой ввод с использованием предложенных селекторов CSS, я попробовал Javascript, похоже, он должен работать, но я не знаком с JS, я только добавил значение и запустил код без успеха, я буду тестировать дальше, но изначально это не сработало, возможно, по тем же причинам, что и выше, Спасибо за вашу помощь

2. Хорошо, вы пробовали работать с JavaScript? Третий вариант.

Ответ №2:

Можно отредактировать html и выполнить скрипт с помощью метода execute_script()

 script="document.getElementsByClassName('num')[0].value=" your_value " ;"
driver.execute_script(script)
 

Вы можете проверить это,запустив скрипт в консоли браузера, он выведет требуемое значение в html-тег.

Комментарии:

1. script="driver.find_element_by_css_selector('#addToCartQty')[0].value=" 3 " ;" driver.execute_script(script) element = driver.find_element_by_ID('#addToCartQty') JavascriptExecutor jse = (JavascriptExecutor) driver; jse.executeScript("arguments[0].value='3';", element); @Prophet @Aswin K Спасибо за предложения, однако, потратив несколько часов на тестирование, результат всегда один и тот же, и я не могу изменить значение с помощью JS, я попробовал несколько различных комбинаций селекторов, класса, идентификатора, xpath, все безрезультатно

2. Я попробовал вышеупомянутую консоль браузера, и следующий результат равен 3, но фактическое значение не записывается в класс «num» document.getElementsByClassName('num')[0].value="3' . Могу ли я что-нибудь предоставить, чтобы помочь лучше понять и решить проблему? Спасибо, если у вас есть какие-либо дополнительные предложения