selenuim是个自动化测试的库,以前简单的看过,但当时没有应用的需求,所以就放在那。
近日,单位要求我们为一批人在网上注册和报名,而且要填写的信息的确很多(这些信息都是在电子表格文件中),刚一开始,他们说直接从电子表格中一个个复制并粘贴到网页中就可以了。我去……,这么多,一个个复制还要盯准行和列,那要做到什么时候T-T?
想着复制、粘贴功能,问了度娘,马上有了结果。pywin库中可以实现将数据写入剪贴板的功能,安装测试。真的很爽,直接用xlrd库从Excel表中读取数据,在终端中每回车一次,就自动复制一次所需要信息到剪贴板,然后在网页中直接粘贴,也算省了不了眼力。就这样干了半天,一看,T—T,还有这么多。我不干心啊……
代码是这样的:
import win32clipboard as w
def set_clip(data):
w.OpenClipboard()
w.EmptyClipboard()
w.SetClipboardText(data)
w.CloseClipboard()
for row in datas:
for data in row:
set_clip(data)
c = input()
if c == q:
break
于是,走了这段弯路之后,想到了selenium。简单地参考了下网上的教程,写出类似似这样的代码。
for row in data_rows:
datas = [row[2],row[7],row[5],'2016',row[6],'234300']
br.get("http://...")
br.find_element_by_name('...').send_keys(row[2])
....
这下总算又省了不少力,可是有五、六个下拉列表框还是要一个个点选;我又是一通乱点...鸳鸯,干掉了不少工作……
selenium也是可以通过点击来选择下列列表中的数据啊?省力最重要,打开网页,定位并检查元素,发现网页代码中根本不是直接用的select标签来实现的,而是通过easyui来生成的。通过一番试验,写出了这样的代码:
selectors = br.find_elements_by_css_selector("a.textbox-icon")
select_option_ids = ['_easyui_combobox_i1_2','_easyui_combobox_i2_0',
'_easyui_combobox_i6_1','_easyui_combobox_i3_2',
'_easyui_combobox_i4_12','_easyui_combobox_i5_4'
]
for slt,slt_id in zip(selectors,select_option_ids):
slt.click()
br.find_element_by_id(slt_id).click()
总算省了点击,可以轻松的完成工作了。
最后总结两点:
1.br.find_element_by_partial_link_text()
注:因为网页界面应用了JS的库所以有的按钮本质是链接,而其中包含很多其他元素。
2.因为网页中加载的速度有时慢,而有的元素没有加载好,点击是不起作用的。所以我使用了类似这样的代码(点击“确认”之后,弹出对话框,再点击“确定”。而有时“确认”按钮没有加载好,点击不起作用,‘确定’按钮也不会出现。):
for i in range(50):
flag = True
try:
br.find_element_by_partial_link_text('确定').click()
except:
flag = False
print('sleep')
time.sleep(1)
br.find_element_by_partial_link_text('确认').click()
time.sleep(0.5)
if flag:
break