如果项目是 'in stock',我如何告诉 selenium 添加到购物车?

How do I tell selenium to add to basket if item is 'in stock'?

如果商品有货,我有以下代码打印 '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

如果项目是 'in stock',我如何告诉 selenium 'add to basket'?

我想:

  1. 转到此 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

  2. 检查右侧的文字是否显示 'In stock.'。

  3. 如果有货,我想把它加入购物车。

我通过检查->复制->复制完整的 x 路径获得了 xpath。

假设您的代码的最后一行 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

有关添加带有按钮的 item/interacting 的逻辑,请查看以下内容:https://pythonspot.com/selenium-click-button/

最好使用相对 XPath。

我们正在使用 presence_of_all_elements_located,如果找到,它将 return 一个 list of web elements,如果没有,它将是 an empty list,所以 in_stock 是一个列表的网络元素。现在,len() 是一种方法,它将为我们提供列表中存在多少 Web 元素的输出。因此,逻辑类似于,如果列表有任何内容,那么它必须是 In stock -> 现在 add to basket,否则在这种情况下它必须是 <00 "In stock" 不会出现,我们也不会在购物篮中添加任何东西。

下面的代码转到 URL,寻找 "In stock" text 如果存在则 "Add to basket" 如果不是 tear down bot.

代码:

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

进口:

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