Я создаю бота для автоматизации покупки праймера для пистолета, и мне нужно, чтобы он нажимал выпадающую кнопку для количества раундов

#python #python-3.x #selenium #automation #bots

#python #python-3.x #селен #автоматизация #боты

Вопрос:

Один из друзей моего отца хочет, чтобы я создал бота, который автоматизирует покупку gun primer, потому что они всегда распроданы. У меня есть скрипт с некоторыми боеприпасами в качестве теста (потому что он действительно есть в наличии), но когда я пытаюсь понять, как щелкнуть выпадающий список, терминал всегда выдает эту ошибку

 selenium.common.exceptions.InvalidArgumentException: Message: invalid type: null, expected a string at line 1 column 12
 

Для справки, я использую Python 3.9 с Selenium 3.141.0, и это мой код:

 #imports funcs from selenium
from selenium import webdriver

#chooses your browser

driver = webdriver.Firefox()

#gets your store
url = driver.get("https://www.midwayusa.com/product/2090655809")

#opens the website
driver.get(url)

#makes variables for html elements
button = driver.find_element_by_xpath('//*[@id="productSelectorContainer"]/div[1]/button')

#le button click has arrived
button.click()
 

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

1. В какой строке генерируется исключение? Проясните это в своем опубликованном коде.

2. driver.get(url) является нечетным, поскольку вы уже используете driver.get (фактический url) перед ним.

Ответ №1:

Я думаю, что вижу проблему. У вас есть эти две строки

 #gets your store
url = driver.get("https://www.midwayusa.com/product/2090655809")

#opens the website
driver.get(url)
 

driver.get() ничего не возвращает, поэтому null сохраняется url . Затем в следующей строке вы переходите null к. Эти строки на самом деле избыточны и, похоже, вы неправильно поняли, как их использовать. Вам нужна только первая строка с некоторыми исправлениями.

Я удалил лишнюю строку, исправил другую и внес некоторые коррективы в некоторые ваши комментарии, чтобы сделать их более точными.

 #imports funcs from selenium
from selenium import webdriver

#launches the browser
driver = webdriver.Firefox()

#navigates to your store website
driver.get("https://www.midwayusa.com/product/2090655809")

#stores the button in a variable
button = driver.find_element_by_xpath('//*[@id="productSelectorContainer"]/div[1]/button')

#le button click has arrived
button.click()
 

Ответ №2:

Ошибки:

 url = driver.get("https://www.midwayusa.com/product/2090655809")
 

недопустимо просто использовать driver.get(‘url’)

Вам нужно нажать согласие, иначе оно перекрывает все клики в противном случае.

Вот пример нажатия на 50 единиц товара под рукой, а затем продолжения.

 wait = WebDriverWait(driver, 5)
driver.get("https://www.midwayusa.com/product/2090655809")
driver.maximize_window()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#cookie-consent-btn"))).click() 
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#productSelectorContainer > div.product-filter.original-selector > button"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"#Quantity > ol > li:nth-child(1) > button"))).click()
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button.big-primary-button.add-to-cart-button"))).click()
 

Импорт

 from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 
from selenium.webdriver.support import expected_conditions as EC
 

Выводит

введите описание изображения здесь