点击看一个挺全的讲selenium的教程
跳过模块的引用,之后:
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(chrome_options = chrome_options)
Chrome Options是一个配置chrome启动时属性的类,通过这个参数我们可以为Chrome添加如下参数:
设置 chrome 二进制文件位置 (binary_location)
添加启动参数 (add_argument)
添加扩展应用 (add_extension, add_encoded_extension)
添加实验性质的设置参数 (add_experimental_option)
设置调试器地址 (debugger_address)
这段代码添加了启动参数(add_argument):
–headless | 谷歌浏览器无头模式,在后台运行,不弹出浏览器 |
---|---|
–disable-gpu | 禁用GPU加速 |
同理,随后的代码配置了火狐浏览器并明确了网址,把firefox profile 简写成了fp
firefox_options = Options()
firefox_options.headless = True
browser = webdriver.Firefox(options = firefox_options)
为什么这块还有一句话把firefox的配置赋给了一个新命名的临时浏览器?
temp_browser = webdriver.Firefox(options = firefox_options)
再往下:
browser.get(main_url)
browser.find_element_by_id('txtUserName').clear()
browser.find_element_by_id('txtUserName').send_keys('')
browser.find_element_by_id('txtPassword').clear()
browser.find_element_by_id('txtPassword').send_keys('')
browser.find_element_by_id('btnSignIn').click()
这里的browser是chrome和firefox共用的
find_element_by_id是通过id进行元素查找(定位元素),在浏览器中查找find_element_by_id后面括号引号里面的东西,并进行.后面的操作
这里放一下八种元素定位的方式:
通过id定位元素 | find_element_by_id(“id_vaule”) |
---|---|
通过name定位元素 | find_element_by_name(“name_vaule”) |
通过tag_name定位元素 | find_element_by_tag_name(“tag_name_vaule”) |
通过class_name定位元素 | find_element_by_class_name(“class_name”) |
通过css定位元素 | find_element_by_css_selector() |
通过xpath定位元素 | find_element_by_xpath(“xpath”) |
通过link定位元素 | find_element_by_link_text(“text_vaule”) |
元素定位详细信息点这里
这块代码的意思是:自动让浏览器找到文本为UserName的部分,清空,再模拟键盘读入空格,Password部分同理,最后单击BTN格式(一种和button有关的格式)的SignIn
往后:
with open('test.html', 'w') as file:
file.write(browser.page_source.encode('utf-8'))
以覆盖写模式打开一个叫test.html的文件
这里描述了python 中 open()与with open() as file 的区别
随后,往该文件中以UTF-8的编码模式写入网页源代码(page_source)
往后:
links = browser.find_elements_by_tag_name('small')
for link in links:
if "欢迎光临" in link.text.encode('utf-8'):
print link.text
links = browser.find_elements_by_tag_name('span')
for link in links:
if "用户名或密码不正确" in link.text.encode('utf-8'):
print link.text
browser.quit()
找到名为“small”的标签,存到列表 *(是列表吗???)*里面,遍历,如果有以utf-8编码的欢迎光临字样存在,就把欢迎光临以.txt格式打印出来 打印到哪里喵喵喵?
之后同理
最后关闭浏览器
往后:
browser.get(main_url + "/Application/ApplicationList.aspx")
#browser.find_element_by_id('ContentPlaceHolder1_chkProjectStatus_23').click()
browser.find_element_by_id('ContentPlaceHolder1_chkProjectType_0').click()
#browser.find_element_by_id('ContentPlaceHolder1_txtPageSize').send_keys(100)
browser.find_element_by_id('ContentPlaceHolder1_btnSearch').click()
第一句话:浏览器读入网址,获取了mainUrl的网址并在后面加上了"/Application/ApplicationList.aspx"(进入了一个子栏目)
注:.aspx是动态网页文件格式
之后有两行是注释掉的,实际上这块代码就是进行了两次元素查找,并让ta自动点击了两下
try:
link = "http://10.5.64.32/JudgeManage/AssessmentAuditEdit.aspx?f3qWWG4YWJNIobR6hnKu0jZfy1lcQqsxUcfTGFEnWsPSMMBvftHT0esfZQB7%2bbfo"
#link = "http://10.5.64.32/JudgeManage/AssessmentAuditEdit.aspx?f3qWWG4YWJNIobR6hnKu0tQPMdsMRb9RLY4vfbjEu36uPFbwN1EjgVrJW5DmSYTj"
browser.get(link)
browser.find_element_by_id('ui-id-5').click()
links = browser.find_elements_by_partial_link_text("检测报告")
for link in links :
pdf_link = link.get_attribute('href')
command = "curl -O " + link
os.system(command)
except:
pass
这块用到了异常处理,如果出现异常则跳过这部分,若无异常,则正常进行:
浏览器自动读入一个网址,浏览器进行元素查找,找到ui-id-5,并点击。
浏览器通过link文字模糊定位元素检测报告,存进列表(是列表吗?),再遍历这个列表,找到包含“href”属性的元素,存到pdf_link里面,随后调用os.system库函数执行command,下载每一个link到系统的一个文件里?
往后:
page_status = browser.find_element_by_id('ContentPlaceHolder1_psApplication_lblPageStatus').text
page_status_string_list = page_status.split(' ')
page_status_string = page_status_string_list[-2]
page_num_string_list = page_status_string.split('/')
page_total = int(page_num_string_list[-1])
用浏览器查找’ContentPlaceHolder1_psApplication_lblPageStatus’,存成text格式,以空格为标志分割这个文档,保存为列表,索引列表里面倒数第二个元素,存下来,再将存下来这部分以’/’为标志分割,形成一个新的列表,再把这个新的列表的最后一个元素转换为整型保存进page_total
往后:
program_links = []
program_num = 0
print "page_total :" + str(page_total)
for page_index in range(0, page_total):
page_index += 1
print "page_index :" + str(page_index)
browser.find_element_by_id('ContentPlaceHolder1_psApplication_txtGotoPage').clear()
browser.find_element_by_id('ContentPlaceHolder1_psApplication_txtGotoPage').send_keys(str(page_index))
browser.find_element_by_id('ContentPlaceHolder1_psApplication_lbtnGoto').click()
while True:
try:
time.sleep(1)
page_status = browser.find_element_by_id('ContentPlaceHolder1_psApplication_lblPageStatus').text
page_status_string_list = page_status.split(' ')
page_status_string = page_status_string_list[-2]
page_num_string_list = page_status_string.split('/')
page_cur = int(page_num_string_list[0])
if page_cur == page_index:
break
except:
pass
table_tr_list = browser.find_element_by_id('systemData').find_elements_by_tag_name("tr")
for tr in table_tr_list:
table_td_list = tr.find_elements_by_tag_name("td")
if len(table_td_list) == 14 and table_td_list[10] != "" and table_td_list[12].text.encode('utf-8') == "已发证":
print tr.text + "\n"
link = table_td_list[10].find_elements_by_tag_name("a")[0].get_attribute('href')
program_links.append(link)
program_num += 1
print program_num
创建空列表program_links
programe_num初始化为0
打印一个page_total
之后进入for循环,遍历0到page_total之间的整数,存为page_index,打印page_index,之后做三次元素查找,在相应的地方分别清空,模拟键盘输入page_index的值,点击…
往后的while循环(第二层循环):
这块用到了异常处理,如果出现异常则跳过这部分,若无异常,则正常进行:
休眠一秒后用浏览器查找’ContentPlaceHolder1_psApplication_lblPageStatus’,存成text格式,以空格为标志分割这个文档,保存为列表,索引列表里面倒数第二个元素,存下来,再将存下来这部分以’/’为标志分割,形成一个新的列表,再把这个新的列表的第一个元素转换为整型保存进page_cur,如果page_cur == page_index,就退出while循环
在两层循环完成之后用浏览器通过id定位元素‘systemData’,再通过tag_name定位元素‘tr’保存进一个列表,遍历这个列表,对于这个列表里面的每一个元素通过tag_name定位元素‘td’,(这里定位元素返回的是什么啊?存到列表里面的是什么qaq?)存进列表。如果列表的长度是14同时第11个元素不是空的并且第13个元素的utf-8编码为已发证,则以文本形式打印‘tr’,并且从查找td元素形成的那个列表的第11个元素中查找‘a’所形成的列表的第一个元素中获取‘href’的属性(???),存到link里面,再把link元素插到program_links列表的最后面,program_num加一,最后打印program_num
往后:
pdf_num = 0
for link in program_links:
try:
browser.get(link)
browser.find_element_by_partial_link_text('实验室检测').click()
links = browser.find_elements_by_partial_link_text("检测报告")
for link in links :
pdf_link = link.get_attribute('href')
command = "curl -O " + pdf_link
os.system(command)
pdf_num += 1
print pdf_num
except:
pass
print pdf_num, program_num
pdf_num初始化为0
遍历programe _links里面每一个link,进行异常处理的,如果产生错误就跳过这块,否则:
从浏览器读入link,通过partial_link_text定位元素实验室检测,再在浏览器里面通过partial_link_text定位元素检测报告,并存进links列表里面
再做一层循环,遍历links里面的每一个元素link,读取它里面‘href’的属性并存到pdf_link里面,随后调用os.system库函数执行command,下载每一个link到系统的一个文件里?
pdf_num + 1
打印pdf_num
往后:
for tr in table_tr_list:
print tr.text
table_td_list = tr.find_elements_by_tag_name("td")
if len(table_td_list) == 14 and table_td_list[12].text.encode('utf-8') == "已发证":
print tr.text
if table_td_list[10] != "":
link = table_td_list[10].find_elements_by_tag_name("a")[0].get_attribute('href')
print link
break
这段代码类似上面某段,故不再赘述~~~
往后:
browser.find_element_by_id('ContentPlaceHolder1_txtEnterpriseName').clear()
a = '杭州金星通光纤科技有限公司'
a = a.decode('utf-8')
print a
browser.find_element_by_id('ContentPlaceHolder1_txtEnterpriseName').send_keys(a)
browser.find_element_by_id('ContentPlaceHolder1_btnSearch').click()
table_tr_list = browser.find_element_by_id("tbList").find_elements_by_tag_name("tr")
for tr in table_tr_list:
print "a"
line = table_tr_list[0].find_elements_by_tag_name("td")
第三行指以utf-8的编码格式解码字符串
详见Python decode()方法
往后:
未完待续(大概就不续惹 )