所以我正在尝试填写 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/