为了看懂250行selenium代码,一个憨憨小白都干了什么

为了看懂250行selenium代码,一个憨憨小白都干了什么

点击看一个挺全的讲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()方法

往后:
未完待续(大概就不续惹 )

你可能感兴趣的:(一个憨憨小白都干了什么,selenium)