【问题标题】:Selenium Python - how to send keys to webformSelenium Python - 如何将密钥发送到网络表单
【发布时间】:2017-10-24 10:47:13
【问题描述】:

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

ElementNotVisibleException:元素不可见 (会话信息:chrome=62.0.3202.62) (驱动信息:chromedriver=2.33.506120 (e3e53437346286c0bc2d2dc9aa4915ba81d9023f),platform=Windows NT 6.1.7601 SP1 x86_64)

上述异常是从以下代码中收到的:

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 新手,如果有人能建议如何将密钥发送到引发异常的字段,我将不胜感激

【问题讨论】:

标签: python selenium


【解决方案1】:

如果你检查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')

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

【讨论】:

    【解决方案2】:

    您可以使用 Selenium waits

    在你的情况下,我会使用 隐式等待

    隐式等待告诉 WebDriver 在尝试查找任何不立即可用的元素(或多个元素)时轮询 DOM 一段时间。默认设置为 0。一旦设置,就会在 WebDriver 对象的生命周期内设置隐式等待。

    例如:

    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)
    browser.implicitly_wait(10) # Here you set it
    
    url = 'https://lifeinsurance.rac.com.au/rac/get-a-quote?productid=51'
    browser.get(url)
    ...
    

    【讨论】:

      猜你喜欢
      • 2016-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-02
      相关资源
      最近更新 更多