python-3.x 尽管使用EC.visibility_of_element_located().click()方法,但单击按钮时仍会出错?

smtd7mpg  于 2023-03-20  发布在  Python
关注(0)|答案(5)|浏览(165)

我正在尝试使用Selenium python在沃尔玛创建帐户。我成功打开了https://www.walmart.com/,并成功转到登录选项卡下的创建帐户按钮。此外,我还成功输入了名字、姓氏、电子邮件地址和密码的详细信息。但是,当我单击创建帐户按钮时,尽管使用了EC.visibility_of_element_located().click()*方法,我还是收到了超时异常错误。
有谁能告诉我我的方法有什么问题吗?先谢谢了。

    • 创建帐户**按钮的网站源代码如下:
<button class="button m-margin-top text-inherit" type="submit" data-automation-id="signup-submit-btn" data-tl-id="signup-submit-btn" aria-label="Create Account, By clicking Create Account, the user is acknowledging that they have read and agreed to the Terms of Use and Privacy Policy">Create account</button>

我的Python代码如下所示:

import time
import requests
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains

url = "https://www.walmart.com/"

first_name = "chuza"
last_name = "123"
email_id = "chuza123@gmail.com"
password = "Eureka1@"

options = Options()
s=Service('C:/Users/Samiullah/.wdm/drivers/chromedriver/win32/96.0.4664.45/chromedriver.exe')
driver = webdriver.Chrome(service=s, options=options)
driver.execute_script("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})")
driver.execute_cdp_cmd("Page.addScriptToEvaluateOnNewDocument", {
    "source":
        "const newProto = navigator.__proto__;"
        "delete newProto.webdriver;"
        "navigator.__proto__ = newProto;"
})
wait = WebDriverWait(driver, 20)
actions = ActionChains(driver)
driver.get(url)
sign_in_btn = wait.until(EC.visibility_of_element_located((By.XPATH, "//div[text()='Sign In']")))
actions.move_to_element(sign_in_btn).perform()
time.sleep(0.5)
wait.until(EC.visibility_of_element_located((By.XPATH, '//button[normalize-space()="Create an account"]'))).click()

f_name = driver.find_element(By.ID, 'first-name-su')
l_name = driver.find_element(By.ID, 'last-name-su')
email = driver.find_element(By.ID, 'email-su')  
pswd = driver.find_element(By.ID, 'password-su')
f_name.send_keys(first_name)
driver.implicitly_wait(2)
l_name.send_keys(last_name)
driver.implicitly_wait(1.5)
email.send_keys(email_id)
driver.implicitly_wait(2)
pswd.send_keys(password)
driver.implicitly_wait(0.5)
### 
wait.until(EC.visibility_of_element_located((By.XPATH, '//button[normalize-space()="Create account"]'))).click()
2lpgd968

2lpgd9681#

我看到这个css选择器代表所需的webelement:

button[data-automation-id='signup-submit-btn']

xpath则为:

//button[@data-automation-id='signup-submit-btn']

每个CSS和XPath有3个匹配节点,Selenium将查找第一个匹配,CSS和XPath基本上是第一个匹配节点。

wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[data-automation-id='signup-submit-btn']"))).click()

wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@data-automation-id='signup-submit-btn']"))).click()

当试图点击一个web元素时,使用element_to_be_clickablevisibility_of_element_located更有意义。而且,与XPath相比,CSS是更好的定位器。

ni65a41a

ni65a41a2#

//button[normalize-space()="Create account"]定位器匹配该页面上的3个元素,您需要使用更精确的定位器。
此定位器是唯一的://form[@id='sign-up-form']//button[@data-tl-id='signup-submit-btn']
所以,这应该行得通:

wait.until(EC.visibility_of_element_located((By.XPATH, "//form[@id='sign-up-form']//button[@data-tl-id='signup-submit-btn']"))).click()
hgb9j2n6

hgb9j2n63#

此基于 xpath 的定位器策略...

//button[normalize-space()="Create account"]

...标识DOM Tree中的三(3)个元素,您所需的元素是列表中的第二个。

溶液
所需的元素是动态元素,因此要单击***clickable***元素而不是 visibility_of_element_located(),您需要引发WebDriver等待 element_to_be_clickable(),然后您可以使用以下定位器策略:

  • 使用 XPATH
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//form[@id='sign-up-form']//button[normalize-space()='Create account']"))).click()

*注意:您必须添加以下导入:

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

xa9qqrwz4#

此问题是由 selenium 元素引起的,您可以通过手动创建来修复此问题,请执行以下步骤:
通过点击搜索框前面的man图标在Walmart IO平台here上创建一个帐户。
登录帐户并接受“使用条款”
单击“Create Your Application”(创建您的应用程序)以创建新应用程序并填写相应的详细信息。
您可以按照this tutorial生成两组公钥/私钥-一组用于生产,另一组用于登台。
使用以下命令上载两个公钥:https://walmart.io/key-upload?app_name=<your app name>
将为生产和阶段的两个集生成消费者ID,这可以在dashboard上看到
点击here上OPD API的“Request Access”(请求访问)并填写表格

ne5o7dgx

ne5o7dgx5#

使用以下代码并替换“variable”和“idname”

variable = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, '//*[@id="idname"]/button'))).click()

如果这不工作右键单击网页,单击inspect然后使用箭头图标来单击他们想要交互的按钮.之后右键单击按钮的源代码并悬停在copy上然后单击copy xpath或任何需要的

相关问题