Selenium Python - 如何将密钥发送到webform

时间:2017-10-24 10:47:13

标签: python selenium

我正在尝试使用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的新手,如果有人可以建议如何将密钥发送到提出异常的字段,我将不胜感激

2 个答案:

答案 0 :(得分:2)

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

对另外两个输入字段执行相同操作

答案 1 :(得分:1)

您可以使用Selenium waits

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

  

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

E.g:

package com.jaysons;  
import java.io.IOException;  
import org.jsoup.Jsoup;  
import org.jsoup.nodes.Document;  
import org.jsoup.nodes.Element;  
import org.jsoup.select.Elements;  

public class ScrapeBody {  
public static void main( String[] args ) throws IOException{  
String url = "https://www.cpsc.gov/Recalls?field_rc_date_value%5Bmin%5D&field_rc_date_value%5Bmax%5D&field_rc_heading_value=&field_rc_hazard_description_value=&field_rc_manufactured_in_value=&field_rc_manufacturers_value=&field_rc_number_value=";  
Document doc = Jsoup.connect(url).get();  

Elements content = doc.select("div.views-field views-field-php");      
doc = Jsoup.parse( content.html().replaceAll("</div>", "</div><span>")
.replaceAll("<div", "</span><div") );  
Elements labels = doc.select("div.remedy");  
for (Element label : labels) {  
System.out.println(String.format("%s %s", label.text().trim(),                                                                                    
label.nextElementSibling().text()));
}  
}        
}