I have the following code that prints 'in stock' if the item is in stock:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
options=Options()
driver=webdriver.Chrome(options=options)
#Directing to site
driver.get("https://www.amazon.co.uk/Nintendo-Switch-OLED-Model-Neon/dp/B098TNW7NM/ref=sr_1_3?keywords=Nintendo Switch&qid=1651147043&sr=8-3");
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[2]/span/form/div[3]/span[1]/span/input"))).click()
condition= print(WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@id='availability']//span[contains(text(),'In stock.')]"))).get_attribute("innerHTML"))
if condition == 'In stock.':
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[2]/div[3]/div[6]/div[4]/div[1]/div[2]/div/div/div/div/div/div/form/div/div/div/div/div[3]/div/div[14]/div[1]/span/span/span/input"))).click()
else:
pass
How do I tell selenium to 'add to basket' if the item is 'in stock'?
I want to:
go to this url: https://www.amazon.co.uk/Nintendo-Switch-OLED-Model-Neon/dp/B098TNW7NM/ref=sr_1_3?keywords=Nintendo Switch&qid=1651147043&sr=8-3
check if the text on the right side says 'In stock.'.
If it is in stock, I'd like to add it to basket.
I got the xpath by going inspect->copy->copy full x path.
CodePudding user response:
You should ideally use relative XPath.
We are using presence_of_all_elements_located
which will return a list of web elements
if found, if not then it will be an empty list
, so in_stock
is a list of web elements. Now, len()
is a method that will give us the output of how many web elements are present in the list. therefore, the logic is something like, if the list has anything then it must be In stock
-> Now add to basket
, else it must be <0
or 0
in that case "In stock"
won't be present and we won't add anything to our basket.
The code below goes to the URL, look for "In stock"
text if it is present then "Add to basket"
if not simply tear down
the bot
.
Code:
driver.maximize_window()
wait = WebDriverWait(driver, 30)
driver.get("https://www.amazon.co.uk/Nintendo-Switch-OLED-Model-Neon/dp/B098TNW7NM/ref=sr_1_3?keywords=Nintendo Switch&qid=1651147043&sr=8-3")
try:
wait.until(EC.element_to_be_clickable((By.XPATH, "/html/body/div[2]/span/form/div[3]/span[1]/span/input"))).click()
print("clicked on accept cookies successfully")
except:
pass
in_stock = wait.until(EC.presence_of_all_elements_located((By.XPATH, "//div[@id='availability']//span[contains(text(),' In stock. ')]")))
try:
if len(in_stock) > 0:
print("In stock must be present.")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#add-to-cart-button"))).click()
print("Clicked on add to cart button")
else:
print("In stock must be not present")
except:
print("Something went wrong")
pass
Imports:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
CodePudding user response:
assuming the last line of your code returns 'in stock'
condition=WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//div[@id='availability']//span[contains(text(),'In stock.')]"))).get_attribute("innerHTML")
if condition == 'in stock':
# logic to add to cart
else:
pass
for the logic on adding an item/interacting with buttons look into this : https://pythonspot.com/selenium-click-button/