Python Selenium 将密钥发送到字段问题

问题描述 投票:0回答:1

我刚开始使用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)

我尝试了很多不同的方法,但未能找到解决方案。正如我所说,我是硒的新手,可能对它没有很好的理解。

python selenium-webdriver automation webautomation
1个回答
0
投票

你们非常接近。你的代码实际上非常好。我在下面有一些改进建议。

这可能是一个艰难的场景。我认为您遇到的问题是您尝试输入“城市”字段,但当时不可见,因为地址建议下拉列表已打开。有几种方法可以解决这个问题...

  1. 按照您的方法手动填写所有字段(地址、城市、州、邮政编码)。为此,您必须关闭地址建议下拉列表才能填写城市、州、邮政编码。如果您选择此路线,则只需将地址发送到地址字段,因为您没有使用地址建议下拉列表。城市、州、邮政编码将进入各自的字段。
  2. 使用自动建议列表并选择第一个选项,该选项应与您输入的完整地址相匹配。

我选择了#2。我还清理了一些东西...

  1. 如果您使用 ID,请使用
    By.ID()
    而不是
    By.XPATH()
  2. 我删除了
    time.sleep()
    。您不需要它们,因为您有适当的等待时间。您有
    WebDriverWait
    ,这很好...最好的做法是使用它们并避免
    time.sleep()
  3. 将来,如果您嵌套了双引号 (
    "
    ),请用单引号 (
    '
    ) 替换它们,例如将
    "//*[@id=\"email\"]"
    更改为
    "//*[@id='email']"
    。它使阅读更容易并删除转义字符。
  4. 如果要单击某个元素,请使用
    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)
© www.soinside.com 2019 - 2024. All rights reserved.