#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
Выводит