seleniumを利用して自動的に教育品質評価を完成する


ツールの準備
  • selenium
  • sudo pip3 install seletinum

  • chromedriver
  • https://chromedriver.chromium.org/downloads
  • /usr/local/binのディレクトリの下に置く、コードは位置
  • を指定しなくてもよい.

    基礎知識
    seleniumは、ページ要素を多くの方法で位置決めすることができます.ここでは簡単に列挙します.driver = webdrriver.Chrome()
  • idによる位置決め
  • driver.find_element_by_id()
  • nameによる位置決め
  • driver.find_element_by_name()
  • tag_を通過name位置決め
  • driver.find_element_by_tag_name()
  • classを通過name位置決め
  • driver.find_element_by_class_name()
  • cssによる位置決め
  • driver.find_element_by_css_selector
  • xpathによる位置決め
  • driver.find_element_by_xpath
    xpath単純構文
    式#シキ#
    概要
    //div
    すべてのdiv要素を選択
    //div[@class=“blog-content-box”]
    classをcblog-content-boxの要素として選択
    //div/link/@href
    すべてのdivラベルの下にあるlinkラベルのリンクを選択
    //div/h2/text()
    すべてのdivラベルの下のh 2ラベル間の内容を選択
    //div[1]/p
    最初のdivラベルの下のpラベルの内容を選択
    //div[1]/p[last()]
    最初のdivラベルの下のpラベルの最後の内容を選択します.
    //div[@class^=“blog”]
    blogで始まるdivラベルをすべて選択
    etree.HTML(html).xpath(‘count(//div/form)’)
    すべてのdivラベルの下のformラベルの数を計算します
  • linkによる位置決め
  • driver.find_element_by_link_text()リンク内のすべての要素を取得driver.find_element_by_partial_link_text()リンク内の要素の一部を取得
    例外処理
    フレーム処理
    frameは非常に大きな穴で、現在のページのframeに注意しないとseleniumで要素が位置決めされない可能性があります.
    frame切替driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))ちえんしょり
    私たちのコードが速すぎるかもしれませんが、現在のhtmlページが完全にロードされていないため、要素が位置決めされません.
  • sleep遅延、絶対遅延
  • を利用time.sleep( )
  • 隠性遅延
  • 最長は30秒で、30秒以内にリソースがすべてロードされると、後続のコードが実行され、30秒以内にロードが完了せず、後続のコードも実行されます.driver.implicitly_wait( )
  • 顕性待ち
  • 待ち時間は20秒、0.5秒間隔でターゲット要素のロードが完了したかどうかを問い合せ、20秒以内にロードが完了した後、後続のコードを実行し、最長20秒待ち、ロードがなくても実行を継続します.WebDriverWait(driver,20,0.5).until(EC.presence_of_element_located( ))
    ここで検索する要素はメタグループであることに注意してください.
    alterポップアップ処理driver.switch_to.alert.accept()を受け入れる
    無視driver.switch_to.alert.dismiss()送信テキストdriver.switch_to.alert.send_keys( )テキストコンテンツの取得driver.switch_to.alert.textコード実装
    #! /usr/bin/python3.8
    import requests
    import sys
    from selenium import webdriver
    import time
    from lxml import etree
    
    
    class Table:
        def __init__(self, number_id, passwd):
            self.url = "      "
            self.number_id = number_id
            self.passwd = passwd
    
        def simulate(self):
            #   
            driver = webdriver.Chrome()
            #    
            driver.maximize_window()
            #     
            driver.get(self.url)
            #   
            driver.find_element_by_id("username").send_keys(self.number_id)
            driver.find_element_by_id("password").send_keys(self.passwd)
            driver.find_element_by_class_name("btn_dl").click()
            time.sleep(1)
            #       
            driver.find_element_by_id("157889684646655577").click()
            #         
            windows = driver.window_handles
            driver.switch_to.window(windows[-1])
            time.sleep(1)
            #        
            driver.find_element_by_xpath(
                "/html/body/div[1]/div[1]/div[2]/ul/li[4]/a/span").click()
            driver.find_element_by_xpath(
                "/html/body/div[1]/div[1]/div[2]/ul/li[4]/ul/li[1]/a").click()
            time.sleep(1)
            #  frame,    
            driver.switch_to_frame(driver.find_element_by_tag_name("iframe"))
            time.sleep(1)
            #           
            html = etree.HTML(driver.page_source)
            size = html.xpath(
                'count(/html/body/form/div[3]/div/div[2]/div/div[1]/select/option)')
            size = int(size)
            #   js    
            commond = "document.getElementById('{}').options[{}].selected = true;"
            for j in range(size):
                #              
                time.sleep(1)
                html = etree.HTML(driver.page_source)
                id_lists = html.xpath("//td/select/@id")
                for i in id_lists:
                    #       
                    if i == "DataGrid1_JS1_14" or i == "DataGrid1_JS2_14":
                        end = commond.format(i, 2)
                    else:
                        end = commond.format(i, 1)
                    driver.implicitly_wait(7)
                    # time.sleep(1)
                    driver.execute_script(end)
                try:
                    time.sleep(2)
                    driver.find_element_by_name("Button1").click()
                except Exception as e:
                    driver.refresh()
                    time.sleep(2)
                    driver.find_element_by_name("Button1").click()
                else:
                    print("success")
            time.sleep(1)
            driver.switch_to.alert.accept()
            time.sleep(1)
            driver.find_element_by_name("Button2").click()
            time.sleep(5)
            driver.quit()
            print("---end----")
    
        def run(self):
            print("---start----")
            self.simulate()
    
    
    if __name__ == "__main__":
        if len(sys.argv) == 3:
            number_id = sys.argv[1]
            passwd = sys.argv[2]
        else:
            print("./          ")
            sys.exit()
        table = Table(number_id, passwd)
        table.run()
    

    注意:各学校の公式サイトは異なり、自分で要素操作にナビゲートする必要があります.
    まとめ
    やはり直接jsで気持ちがいいですね.ハハハ、jsは強すぎます.
    jsコード:copy竜兄
    setInterval(function(){
    	var select = document.getElementById("iframeautoheight").contentWindow.document.getElementsByTagName('select');
    	for (var j = 1; j < select.length; j++) {
    		if (j != select.length - 1) {
    			select[j].options[1].selected = true;
    		} else {
    			select[j].options[2].selected = true;
    		}
    	}
    	if(select.length>16){
    		select[10].options[2].selected = true;
    	}
    	setTimeout(function() {
    		var elements = document.getElementById("iframeautoheight").contentWindow.document.getElementsByTagName('input');
    		for (var i = 0; i < elements.length; i++) {
    			if(elements[i].value == "    "){
    				elements[i].click();
    			}
    		}
    	}, 1000)
    },5000);
    
    setTimeout(function(){
    	var element = document.getElementById("iframeautoheight").contentWindow.document.getElementsByTagName('input');
    	for (var i = 0; i < element.length; i++) {
    		if(element[i].value == "      "){
    			element[i].click();
    		}
    	}
    },62000)
    

    最後にhtmlを作って学籍番号とパスワードを入力して、postを通じてサーバーに送信して、最後に自動教育の品質の評価コードを呼び出して完成して、フレームワークを学んだことがなくて、コードの書くのはとても腐って、笑うことができません.