自动按钮点击硒时出现问题

时间:2015-11-05 00:16:12

标签: 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

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

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

2 个答案:

答案 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()来绕过它。