所以我想填写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
我的问题是,如何在脚本末尾提交表单?
编辑:没有错误。问题是它根本没有点击我想要它的按钮。我尝试在单独的文件上运行以下代码并且它有效,但是当您使用整个脚本运行它时它不起作用。
答案 0 :(得分:1)
这是一个奇怪的...我花了一分钟来弄清楚发生了什么。问题是实际上有两个元素在页面上有这个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()
答案 1 :(得分:0)
您并没有真正提出问题,但您可能需要查看WebElement类的方法和属性。 看起来根据您的代码,该按钮可能不在窗口的可见部分。 WebElement有一个属性调用,滚动直到元素移动到视图中。
如果Selenium定义看不到某个元素,则该元素不可点击。
即使您使用页面的内容来驱动它,selenium也想假装它正在测试人类的交互,因此提供了一个人为约束。
您可以通过在元素上执行JavaScript click()来绕过它。