__author__ = 'Mickey0s' # coding:utf8 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait as wdw from selenium.webdriver.support import expected_conditions as ec from random import randint from time import sleep dr = webdriver.Ie() url = u'http://s.cr-nielsen.com/q/402/cn0376/html/402.htm' def singleradio(na): wdw(dr, 10).until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[type="radio"]'))) radios = dr.find_elements_by_css_selector('input[type="radio"]') if len(radios) > 3: if na == 'Q1': radios[2].click() else: radios[randint(0, len(radios)-3)].click() else: radios[0].click() dr.find_element_by_class_name('submit-button').click() sleep(1) return dr.window_handles def textfill(na): wdw(dr, 10).until(ec.presence_of_all_elements_located) texts = dr.find_element_by_name(na).find_elements(By.CSS_SELECTOR, 'input[type=text]') for i in texts: i.send_keys('i am a fish!') dr.find_element_by_class_name('submit-button').submit() sleep(1) return dr.window_handles def tableradio(na): tables = dr.find_element_by_name(na).find_element_by_tag_name('tbody').find_elements_by_tag_name('tr') for i in tables[:]: dr.implicitly_wait(3) tem = i.find_elements_by_tag_name('td') wdw(dr, 10).until(ec.presence_of_all_elements_located) t = tem[randint(1, len(tem)-1)].find_element_by_tag_name('input') if ec.element_to_be_clickable(t): t.click() dr.find_element_by_class_name('submit-button').submit() sleep(1) return dr.window_handles def checkbox(na): wdw(dr, 10).until(ec.presence_of_element_located((By.CSS_SELECTOR, 'input[type="checkbox"]'))) boxs = dr.find_elements_by_css_selector('input[type="checkbox"]') boxs.pop(-2) l = len(boxs) for i in boxs: if randint(0, l-1)%2 == 0: i.click() dr.find_element_by_class_name('submit-button').submit() sleep(1) return dr.window_handles page = {'Q1': (singleradio, '请问,您的年龄是?(单选)'), 'Q1B': (textfill, '想到的是哪些品牌'), 'Q2B': (tableradio, '品牌的熟悉程度?(横向单选)'), 'Q3B': (tableradio, '总体评价是?(横向单选)'), 'Q4B': (tableradio, '购买以下品牌的可能性有多大? (横向单选)'), 'Q5B': (singleradio, '倾向购买以下哪个品牌?(单选) '), 'Q6B': (tableradio, '同意程度如何?(每行单选) '), 'Q1Ca': (singleradio, '是否看到过这个视频广告?[单选]'), 'Q2Ca': (singleradio, '多喜欢这个广告?[单选]'), 'Q2Cb': (singleradio, '多喜欢这个广告?[单选]'), 'Q3Ca': (checkbox, '哪些方面是您所喜欢的?[可多选] '), 'Q3Cb': (checkbox, '哪些方面是您所喜欢的?[可多选] '), 'Q4Ca': (checkbox, '您所不喜欢的?[可多选]'), 'Q5Ca': (singleradio, '哪一项符合这个广告?[单选]'), 'Q6Ca': (tableradio, '是否同意下列描述?[每行单选] '), 'Q1Cb': (singleradio, '看到过这个视频广告?[单选]'), 'Q1D': (singleradio, '图片广告(横幅、竖栏、浮层等)?[单选]'), 'Q1S': (singleradio, '性别是?(单选)'), 'Q2S': (singleradio, '学历是?(单选)'), 'Q3S': (singleradio, '职业是?(单选) '), 'Q4S': (singleradio, '税前个人月收入?(单选) '), 'Q5S': (singleradio, '孩子多大了?(单选) '), 'Q6S': (singleradio, '阅读几本书籍'), 'Q7S': (checkbox, '哪些电子设备?(可多选) '), 'Q8S': (checkbox, '哪些电子设备?(可多选) '), } try: dr.get(url) frame = dr.find_elements_by_tag_name('frame') if len(frame) == 1: dr.switch_to_frame(frame[0]) for e in page: te = dr.find_element_by_css_selector('a[name]') tt = te.get_attribute('name') print tt try: w = page[tt][0](tt) finally: print 0 dr.switch_to_window(w[-1]) frame = dr.find_elements_by_tag_name('frame') if len(frame) == 1: dr.switch_to_frame(frame[0]) finally: sleep(5) dr.quit()
-------------------------
btw: 练习项目,非正式 1. 对一种类型的页面,类似的操作包装成函数 2. 试着使用page factory, 元素、操作、数据分离(这个练习没有多少数据) 3. 元素定位,对于复杂的元素定位,还是要用CSS、xpath 4. 判断每个页面的类型,在字典中选择对应类型的操作。此练习使用的 关键字 5.点击下一个页面后,用一遍dr.switch_to_window(w[-1]),没检验过是否必要 dr.switch_to_window(w[-1]) frame = dr.find_elements_by_tag_name('frame') if len(frame) == 1: dr.switch_to_frame(frame[0]) 未解决: 总结4 中使用关键字,定位页面类型,实际上关键字会变动,导致失败,应该使用更好的判断方法