Selenium Python-如何向webform发送密钥

Selenium Python-如何向webform发送密钥,python,selenium,Python,Selenium,我正在尝试使用selenium填写一个Web表单。虽然我能够成功填充大多数文本框并选择单选按钮,但在尝试向表单第二部分的三个[出生日期]字段(日、月和年)以及一个[救生衣]字段发送密钥时,我收到以下异常 ElementNotVisibleException:元素不可见 (会话信息:chrome=62.0.3202.62) (驱动程序信息:chromedriver=2.33.506120(E3E5343736286C0BC2D2DC9AA4915BA81D9023F),平台=Windows NT

我正在尝试使用selenium填写一个Web表单。虽然我能够成功填充大多数文本框并选择单选按钮,但在尝试向表单第二部分的三个[出生日期]字段(日、月和年)以及一个[救生衣]字段发送密钥时,我收到以下异常

ElementNotVisibleException:元素不可见 (会话信息:chrome=62.0.3202.62) (驱动程序信息:chromedriver=2.33.506120(E3E5343736286C0BC2D2DC9AA4915BA81D9023F),平台=Windows NT 6.1.7601 SP1 x8664)

从以下代码接收上述异常:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

path_to_chromedriver = 'C:/Users/Me/chromedriver/chromedriver'
browser = webdriver.Chrome(executable_path = path_to_chromedriver)

url = 'https://lifeinsurance.rac.com.au/rac/get-a-quote?productid=51'
browser.get(url)

...

# date of birth - CANNOT POPULATE!
browser.find_element_by_id('txtDateOfBirth__1_Day').send_keys('01')
browser.find_element_by_id('txtDateOfBirth__1_Month').send_keys('06')
browser.find_element_by_id('txtDateOfBirth__1_Year').send_keys('1988')

...

# cover amount - CANNOT POPULATE!
browser.find_element_by_xpath('//*[@id="txtCoverAmount__1"]').send_keys('150000')

...
完整代码(包括上述内容)如下所示:

from selenium import webdriver
from selenium.webdriver.common.keys import Keys

path_to_chromedriver = 'C:/Users/Me/chromedriver/chromedriver'
browser = webdriver.Chrome(executable_path = path_to_chromedriver)

url = 'https://lifeinsurance.rac.com.au/rac/get-a-quote?productid=51'
browser.get(url)

# quote type
browser.find_element_by_xpath('//*[@id="rdApplicantCount_1_Label"]/span[1]').click()

# title
browser.find_element_by_xpath('//*[@id="divApplicantDetails__1"]/div[1]/div/div[2]/span/span/span[1]').click()
browser.find_element_by_xpath('//*[@id="ddTitle__1_listbox"]/li[2]').click()

# first name and surname
browser.find_element_by_name('txtFirstName__1').send_keys('richard')
browser.find_element_by_name('txtSurname__1').send_keys('castle')

# email
browser.find_element_by_name('txtEmail__1').send_keys('rcastle@gmail.com')

# mobile number
browser.find_element_by_name('txtPhoneNumber__1').send_keys('0418545898')

# date of birth - CANNOT POPULATE!
browser.find_element_by_id('txtDateOfBirth__1_Day').send_keys('01')
browser.find_element_by_id('txtDateOfBirth__1_Month').send_keys('06')
browser.find_element_by_id('txtDateOfBirth__1_Year').send_keys('1988')

# gender
browser.find_element_by_xpath('//*[@id="rdGender_Female__1_Label"]/span[1]').click()

# residence
browser.find_element_by_xpath('//*[@id="divApplicantDetails__1"]/div[8]/div/div[2]/span/span/span[1]').click()
browser.find_element_by_xpath('//*[@id="ddResidentialStatusId__1_listbox"]/li[1]').click()

# residing in australia
browser.find_element_by_xpath('//*[@id="rdResidingInAustralia_Yes__1_Label"]/span[1]').click()

# open cover section
browser.find_element_by_xpath('//*[@id="divQuote_Accordion"]/div[3]/div').click()

# tobacco
browser.find_element_by_xpath('//*[@id="rdSmoker_Yes__1_Label"]/span[1]').click()

# cover amount - CANNOT POPULATE!
browser.find_element_by_xpath('//*[@id="txtCoverAmount__1"]').send_keys('150000')

# get quote
browser.find_element_by_xpath('//*[@id="divApplicantCover"]/div[3]/div[2]/button').click()

# premium frequency
browser.find_element_by_xpath('//*[@id="productTabStrip-1"]/div[1]/div[1]/div/div[4]/div[2]/span/span/span[1]').click()
browser.find_element_by_xpath('//*[@id="ddPremiumFrequencyId_listbox"]/li[2]').click()

# capture result
browser.find_element_by_xpath('//*[@id="productTabStrip-1"]/div[1]/div[1]/div/div[3]/div[1]/div[2]/span').text
我是selenium新手,如果有人能建议如何向引发异常的字段发送密钥,我将不胜感激。

您可以使用selenium

在您的情况下,我将使用隐式等待

隐式等待告诉WebDriver在试图查找任何不立即可用的元素时轮询DOM一段时间。默认设置为0。设置后,将为WebDriver对象的生命周期设置隐式等待

例如:


如果您检查
input
字段的HTML源代码,您将看到它具有
style=“display:none;”
属性,这意味着您无法与此元素交互,即使要实现显式/隐式等待。。。要使其可见,请尝试将
style=“display:none;”“
更改为
style=“display:inline;”“
,如下所示:

day = browser.find_element_by_id('txtDateOfBirth__1_Day')
browser.execute_script('arguments[0].style.display="inline";', day)
day.send_keys('01')

对其他两个输入字段执行相同的操作

您应该尝试显式等待这些输入字段的可见性。
day = browser.find_element_by_id('txtDateOfBirth__1_Day')
browser.execute_script('arguments[0].style.display="inline";', day)
day.send_keys('01')