python - 自动按钮点击 Selenium 时出现问题

标签 python selenium

所以我正在尝试填写 this 上的表格地点。每次我尝试使用我认为正确的 ID 单击最后的提交按钮时,它只会给我一个错误。这是一个代码片段:

from selenium import webdriver

thePassword = "asdf123"

print("Desired name: ")
name = raw_input()

print("Desired Last Name: ")
userLastName = raw_input()

browser = webdriver.Firefox()
browser.get('https://www.panerabread.com/en-us/mypanera/registration-page.html')

firstName = browser.find_element_by_id('join_first_name')
firstName.send_keys(name)

lastName = browser.find_element_by_id('join_last_name')
lastName.send_keys(userLastName)

emailElem = browser.find_element_by_id('join_email')
emailElem.send_keys("asdafasda" + "@gmail.com")

emailConfirm = browser.find_element_by_id("join_confirm_email")
emailConfirm.send_keys("asdafasda" + "@gmail.com")

password = browser.find_element_by_id("join_password")
password.send_keys("thePassword")

passwordConfirm = browser.find_element_by_id("join_confirm_password")
passwordConfirm.send_keys("thePassword")

phoneA = browser.find_element_by_id("phone_number_a")
phoneA.send_keys("231")

phoneB = browser.find_element_by_id("phone_number_b")
phoneB.send_keys("123")

phoneC = browser.find_element_by_id("phone_number_c")
phoneC.send_keys("2310")

tos = browser.find_element_by_id("join_i_agree")
tos.click()

browser.execute_script("$('#join_password').get(0).scrollIntoView();")
#browser.implicitly_wait(10)

# And then perform the click
browser.find_element_by_id("join_card_not_available").click()

browser.find_elements_by_css_selector("#join-now-primary")[1].click()

print "Your email is: " + "asdafasda" + "@gmail.com"
print "Your password is: " + thePassword

我的问题是,如何在脚本末尾提交表单?

编辑:没有错误。问题是它根本没有点击我想要的按钮。我尝试在单独的文件上运行以下代码并且它有效,但是当您使用整个脚本运行它时它不起作用。

最佳答案

这很奇怪......我花了一分钟才弄清楚发生了什么事。问题是,页面上实际上有两个元素具有该 id(这是一个禁忌 according to the HTML standard ...但可惜它发生了)。一个位于您正在查看的页面底部,另一个位于“登录”弹出窗口中。如果您单击页面顶部的“登录”按钮,您将在弹出窗口中看到(第一个)“登录”按钮。因为它是隐藏的,所以您的代码不会点击它。无论如何...解决方案。

有几种方法可以解决这个问题,其中任何一种都是有效的。我会这样做。

browser.find_elements_by_css_selector("#join-now-primary")[1].click()

它的作用是使用 CSS 选择器来获取所有带有 ID=join-now-primary 的元素。 CSS 选择器是#join-now-primary,表示join-now-primary 的 id (#)。因为它使用 .find_elements (复数),所以它会同时获得两者。然后我们使用 [1] 获取第二个元素(从 0 开始的索引,因此 1 是第二个),然后单击它。

<小时/>

编辑

我的猜测是,这是一个计时问题,导致代码可以单独工作,但不能在您的脚本中工作。在第一行放置一个断点并单步执行每一行并确保其执行。有效吗?如果我再猜一次...这可能是“立即加入”单击之前的那一行。该点击有一个关闭信用卡图片的动画。我会使用下面的代码等待该部分变得不可见

element = WebDriverWait(browser, 5).until(EC.invisibility_of_element_located(By.ID('panera-card-section')))
browser.find_elements_by_css_selector("#join-now-primary")[1].click()

关于python - 自动按钮点击 Selenium 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33534536/

相关文章:

python - 查找图像中的所有圆圈

python - beautifulsoup 用于分离 &nbsp 和 ;在 html 标签内

python - 如何在 selenium python 中访问带有索引号的 xpath?

python - 如何从我的本地浏览器观看远程服务器上 docker 内的 xvfb session ?

c#-4.0 - 无法按名称和 XPath 在 Selenium WebDriver 中找到元素

python - 如何读取和处理文件的一部分并将其余部分写入另一个文件?

python - Keras InvalidArgumentError 与 Model.Fit()

python - Terraform:验证错误...成员必须满足正则表达式模式:arn:aws:iam::

java - 无法使用 Selenium WebDriver 将 Keys() 发送到 TinyMCE

selenium - 如何在 Selenium WebDriver 3 中最小化浏览器窗口