我刚开始使用Python的selenium模型,在尝试自动化这家商店的结帐过程时遇到了问题,https://bellevo.store/products/luna。 我有 python 点击立即购买并填写信息,它运行良好,直到到达城市字段。我不认为它是可点击的,我不知道为什么。任何帮助将非常感激。这是我的代码
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time
# Initialize a new browser instance
driver = webdriver.Chrome()
# Click "Buy It Now"
wait = WebDriverWait(driver, 10)
buy_now_button = wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id=\"product form-template--22164028883241__main\"]/div/div/dynamic-checkout")))
buy_now_button.click()
# Fill in contact and delivery fields
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id=\"email\"]"))).send_keys(phone_number)
time.sleep(.5)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id=\"TextField0\"]"))).send_keys(first_name)
time.sleep(.5)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id=\"TextField1\"]"))).send_keys(last_name)
time.sleep(.5)
wait.until(EC.element_to_be_clickable((By.XPATH, "//*[@id=\"billing-address1\"]"))).send_keys(address + ", " + city + ", " + state + ", USA")
time.sleep(.5)
wait.until(EC.element_to_be_clickable((By.XPATH, "//label[@id=\"TextField6-label\"]"))).send_keys(city)
我尝试了很多不同的方法,但未能找到解决方案。正如我所说,我是硒的新手,可能对它没有很好的理解。
你们非常接近。你的代码实际上非常好。我在下面有一些改进建议。
这可能是一个艰难的场景。我认为您遇到的问题是您尝试输入“城市”字段,但当时不可见,因为地址建议下拉列表已打开。有几种方法可以解决这个问题...
我选择了#2。我还清理了一些东西...
By.ID()
而不是 By.XPATH()
。time.sleep()
。您不需要它们,因为您有适当的等待时间。您有 WebDriverWait
,这很好...最好的做法是使用它们并避免 time.sleep()
。"
),请用单引号 ('
) 替换它们,例如将 "//*[@id=\"email\"]"
更改为 "//*[@id='email']"
。它使阅读更容易并删除转义字符。EC.element_to_be_clickable()
。如果您打算以其他方式与元素交互,例如send_keys(),使用 EC.visibility_of_element_located()
。在大多数情况下避免 EC.presence_of_element_located()
...它只是确认元素位于 DOM 中,而不是它可见或准备好被单击。我看到很多人使用它,然后单击等等元素...这只是询问很难追踪的间歇性问题。考虑到我的所有建议,清理后的代码如下并且可以工作。
from selenium import webdriver
from selenium.webdriver import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
# Initialize a new browser instance
url = 'https://bellevo.store/products/luna'
driver = webdriver.Chrome()
driver.maximize_window()
driver.get(url)
wait = WebDriverWait(driver, 10)
# Click "Buy It Now"
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button.shopify-payment-button__button"))).click()
# Fill in contact and delivery fields
wait.until(EC.element_to_be_clickable((By.ID, "email"))).send_keys(phone_number)
wait.until(EC.element_to_be_clickable((By.ID, "TextField0"))).send_keys(first_name)
wait.until(EC.element_to_be_clickable((By.ID, "TextField1"))).send_keys(last_name)
e = wait.until(EC.visibility_of_element_located((By.ID, "billing-address1")))
e.send_keys(f"{address}, {city}, {state}, USA")
wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#billing-address1-options > li"))).click()
e.send_keys(Keys.ENTER)