前两天基础架构的同事遇到个问题,需要批量设置集团用户的邮箱设置,但是手工一个个操作实在是费时间,于是我就想到了用python来解决。
需求描述:登录腾讯企业邮箱
点击设置
点击客户端设置
收取选项设置为全部后,保存更改
点击右上角的退出
账号、密码保存在excel文件里。
解决方法:使用selenium包来操作网页,实现批量修改
遇到的问题点:
1、定位网页中的元素位置
定位“设置”时我使用的find_element_by_xpath,很容易找到了元素
qqmail.find_element_by_xpath('/html/body/div[3]/div[2]/div[1]/div[2]/div[1]/div[1]/span[3]/a[2]').click()#定位语句去源码中找
定位“客户端设置”时遇到了点麻烦,本来也想用xpath,但是一直失败,后来搜了搜资料,发现可以先定位到form,然后再模糊查询
#点击客户端设置 qqmail.switch_to.frame("mainFrame") qqmail.find_element_by_partial_link_text("客户端设置").click()#定位语句去源码中找
2、设置下拉列表的值
这个值的设置找了好多资料,最后用selenium的select解决的
from selenium.webdriver.support.select import Select
#设置默认期限 val = qqmail.find_element_by_id("poprecent") Select(val).select_by_value("65535")
3、点退出当前账号后清空原输入框中的账号记录
这个位置我试了好几个方法,包括双击输入框,发现双击输入框也不好用,因为账号是有@xxx.com后缀的,双击会只选择前半部分。其实是我想复杂了,只要执行单击输入框,再清空就可以了
eleacct = qqmail.find_element_by_xpath("//*[@id='inputuin']") eleacct.click()#点击这个文本框 ActionChains(qqmail).double_click(eleacct).perform() eleacct.clear()
4、数据源就不是问题了,用xlwings,读取文件里的账号和密码两列数据,放进数组表即可
5、我用的是chrome,用这个浏览器的话,需要下载一个chromedriver放在python.exe所在的文件夹。chromedriver的版本需要与chrome的版本一致
示例代码如下:
from selenium import webdriverimport time,keyboardfrom selenium.webdriver.support.select import Selectfrom selenium.webdriver.common.action_chains import ActionChainsimport osimport xlrdimport xlwings as wxdef login(qqmail,name,pwd): print("当前登录账户"+name) qqmail.find_element_by_xpath('/html/body/div[1]/div[2]/div/form/div[3]/div[3]/a[1]').click()#定位语句去源码中找 time.sleep(1)#延时加载 #找到登录框,输入账号密码 eleacct = qqmail.find_element_by_xpath("//*[@id='inputuin']") eleacct.click()#点击这个文本框 ActionChains(qqmail).double_click(eleacct).perform() eleacct.clear() qqmail.find_element_by_xpath("//*[@id='inputuin']").send_keys(name) qqmail.find_element_by_xpath("//*[@id='pp']").clear() qqmail.find_element_by_xpath("//*[@id='pp']").send_keys(pwd) #模拟点击登录 qqmail.find_element_by_xpath("//*[@id='btlogin']").click() time.sleep(1) #点击设置 try: qqmail.find_element_by_xpath('/html/body/div[3]/div[2]/div[1]/div[2]/div[1]/div[1]/span[3]/a[2]').click()#定位语句去源码中找 time.sleep(1)#延时加载 except: # 打印异常信息 print("当前登录账户异常"+name) pass #点击客户端设置 qqmail.switch_to.frame("mainFrame") qqmail.find_element_by_partial_link_text("客户端设置").click()#定位语句去源码中找 time.sleep(1)#延时加载 #设置默认期限 val = qqmail.find_element_by_id("poprecent") Select(val).select_by_value("65535") time.sleep(1)#延时加载 #点击保存 qqmail.find_element_by_partial_link_text("保存更改").click()#定位语句去源码中找 time.sleep(1)#延时加载 #退出FORM qqmail.switch_to.default_content() time.sleep(1)#延时加载 #点击退出 qqmail.find_element_by_partial_link_text("退出").click()#定位语句去源码中找 time.sleep(1)#延时加载 def open_file(filename,list_id): app = wx.App(visible=False, add_book=False) # 不打开baiexcel print("开始处理"+filename) wb = app.books.open(filename) sheet = wb.sheets[0] # 获取有值的最大行数和列数 nrows = sheet.used_range.last_cell.row for row in range(2,nrows+1): name = str(sheet.range((row,1)).value) pwd = str(sheet.range((row,2)).value) acct=[name,pwd] list_id.append(acct) wb.close() app.quit() def main(): file_name = input('输入文件:') # 文件夹位置 list_id = [] try: qqmail = webdriver.Chrome() qqmail.get('https://exmail.qq.com/login') qqmail.maximize_window() time.sleep(2) open_file(file_name,list_id) print(list_id) for acct in list_id: qqmail.refresh() login(qqmail,acct[0],acct[1]) qqmail.quit() except Exception as e: # 打印异常信息 print(e)if __name__=='__main__': main()