webdriver简单脚本分析:登录、等待、frame切换
1.一个登录大麦网站的简单脚本
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.keys import Keys from selenium.webdriver.support.ui import WebDriverWait import time url = 'https://www.damai.cn/' username = 'sssssssss' password = 'sssssssssss' def login(): b = webdriver.Firefox() b.get(url) #WebDriverWait等待10s,直到查找到元素 ele_log=WebDriverWait(b,10).until(lambda b:b.find_element_by_xpath('html/body/div[2]/div/div[3]/div[1]/div[1]/span')) ele_log.click() # b.implicitly_wait(10) #设置webdriver等待时间 #<iframe style="border: medium none;" scrolling="no" src="//ipassport.damai.cn/mini_login.htm?lang=zh_cn&/ # appName=damai&appEntrance=default&styleType=vertical&bizParams=&notLoadSsoView=true&notKeepLogin=false&/ # isMobile=false&showSnsLogin=false&regUrl=%2F%2Fpassport.damai.cn%2Fregister&plainReturnUrl=%2F%2Fpassport.damai.cn%2Flogin&/ # returnUrl=https%3A%2F%2Fpassport.damai.cn%2Fdologin.htm%3FredirectUrl%3Dhttps%25253A%25252F%25252Fwww.damai.cn%25252F%26platform%3D106002&/ # rnd=0.8137200034369335" id="alibaba-login-box" frameborder="none" height="342" width="350"></iframe> ifr = WebDriverWait(b, 10).until(lambda b: b.find_element_by_id('alibaba-login-box')) b.switch_to_frame('alibaba-login-box') # 页面嵌套,需要找iframe的id,进行页面切换 user=b.find_element_by_id('fm-login-id').send_keys(username) time.sleep(0.5) passwd=b.find_element_by_id('fm-login-password').send_keys(password) time.sleep(0.5) lo_bn = b.find_element_by_xpath('html/body/div[1]/div/div[2]/div/form/div[4]/button') lo_bn.click() b.quit() if __name__=='__main__': login()
2.将脚本模块化
代码可读性更强,便于维护
from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait import time elenm={'url':'https://www.damai.cn/', 'username' : 'xxxxxx', 'password' : 'yyyyyy', 'user_ele_id':'fm-login-id', 'pwd_ele_id':'fm-login-password', 'lo_xpath':'html/body/div[1]/div/div[2]/div/form/div[4]/button'} def wait_time(driver,time,func): #定义等待时间模块 return WebDriverWait(driver,time).until(func) def open_web(): #第一个模块:打开浏览器 webdriver_handle = webdriver.Firefox() return webdriver_handle def open_url(driver,url): ##第二个模块:打开网址,进入登录界面 driver.get(url) driver.maximize_window() #WebDriverWait等待10s,直到查找到元素 ele_log= wait_time(driver,10,lambda b:b.find_element_by_xpath('html/body/div[2]/div/div[3]/div[1]/div[1]/span')) ele_log.click() #点击进入登录页面 ifr = WebDriverWait(driver, 10).until(lambda b: b.find_element_by_id('alibaba-login-box')) driver.switch_to_frame('alibaba-login-box') # 页面嵌套,需要找iframe的id,进行页面切换 def find_ele(driver,arg): #第三个模块:获取元素 ifr1 = WebDriverWait(driver, 10).until(lambda b: b.find_element_by_id(arg['user_ele_id'])) user = driver.find_element_by_id(arg['user_ele_id']) passwd = driver.find_element_by_id(arg['pwd_ele_id']) lo_bn =driver.find_element_by_xpath(arg['lo_xpath']) return user,passwd,lo_bn def sendkey(ele_tuple,arg): #第四个模块:数据发送 listkey=['username','password'] i=0 for key in listkey: ele_tuple[i].send_keys('') ele_tuple[i].clear() ele_tuple[i].send_keys(arg[key]) time.sleep(0.5) i+=1 ele_tuple[2].click() def login(): #主登录模块 b = open_web() #第一个模块:打开浏览器 open_url(b, elenm['url']) #第二个模块:打开网址 ele_tuple=find_ele(b,elenm) #第三个模块:获取登录需要的元素 sendkey(ele_tuple,elenm) #第四个模块:数据发送 if __name__=='__main__': login()