發表文章

目前顯示的是 2023的文章

Python List

create a=[] 新增一個空序列。 a=[1]*3=[1,1,1] 新增一個序列,裏面放了3個1。 a=[1 for i in range(3)]=[1,1,1] 新增一個序列,裏面放了3個1。 ';'.join(a) 將序列 a 產生一個字串 '1;1;1'。 Reference Python List必學實作 序列类型 --- list, tuple, range Python 推导式 P ython String join()

Selenium WebDriverWait

from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def ready (browser:webdriver) -> bool : readyState = browser . execute_script( 'return document.readyState' ) if readyState == 'complete' : return True return False browser = webdriver . Firefox() browser . get( 'http://xxx.xxx.xxx' ) WebDriverWait(browser, 60 ) . until(ready) WebDriverWait(browser, 60 ) . until( lambda browser: browser . execute_script( 'return document.readyState' ) == 'complete' )

selenium timeout

timeout $ python3 Python 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from selenium import webdriver >>> browser = webdriver.Firefox() >>> browser.get('http://xxx.xxx.xxx') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/test/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 333, in get self.execute(Command.GET, {'url': url}) File "/home/test/.local/lib/python3.6/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute self.error_handler.check_response(response) File "/home/test/.local/lib/python3.6/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions...

Selenium upload a file

filename = browser . find_element(By . NAME, "filename" ) filename . send_keys(os . path . abspath( "./test.bin" )) 使用 send_keys() 就可以輸入檔案,記住不可以輸入相對位置的檔案,會產生找不到檔案的錯誤。 os.path.abspath() 可以轉換相對位置的檔案。 Reference How to upload file with selenium (Python)?

Selenium select

browser.find_element(By.XPATH,"//select[1]/option[2]").click() 選取第二個 option。 browser.find_element(By.XPATH,"//select[1]").get_attribute("value") 取得目前 select 的值。 Reference 透過 Selenium 操作下拉式選單 (Select) What is the correct way to select an <option> using Selenium's Python WebDriver Python: webdriver操作select下拉选项, selenium设定select选项, selenium select dropdown, Handling Dropdowns

Selenium window

note browser.execute_script("window.open('https://www.google.com/','aaa')") 在視窗名稱aaa載入google網頁,如果視窗aaa不存在,就會新開一個視窗。 browser.execute_script("window.open('')") 直接新開一個視窗,不指定視窗名稱。 browser.execute_script("return window.name") 讀取目前視窗名稱。 browser.switch_to.window(browser.window_handles[0]) 切換第一個視窗,也就是最開始的那個視窗。 browser.switch_to.window(browser.window_handles[1]) 切換第二個視窗。 browser.switch_to.window('aaa') 切換到名稱aaa的視窗。 browser.switch_to.window('') 切換第一個沒有名稱視窗,也就是最開始的那個視窗。 browser.close() 關閉目前的視窗,此時要馬上做 browser.switch_to.window(browser.window_handles[0]) 切換視窗,不然會因為找不到視窗出現錯誤而無法執行任何指令,包含 browser.switch_to.window('') 也會錯誤。 請注意 window.open() 是在目前視窗右邊插入一個新視窗,而不是在最後面再開一個新視窗,還有 window_handles 的 index 是看目前 browser 上的 TAB 位置,而不是看你開啟視窗的順序。 Reference Opening and Closing Tabs Using Selenium How To Switch Tabs In A Browser Using Selenium Python? 快速了解window.name特性与作用

Python debug message

debug.py #!/usr/bin/env python3 # -*- coding: utf-8 -*- import sys import traceback def dump (e: Exception ): #取得錯誤類型 error_class = e . __class__ . __name__ #取得詳細內容 detail = str (e) #取得Call Stack cl, exc, tb = sys . exc_info() #取得Call Stack的最後一筆資料 lastCallStack = traceback . extract_tb(tb)[ -1 ] #取得發生的檔案名稱 fileName = lastCallStack[ 0 ] #取得發生的行號 lineNum = lastCallStack[ 1 ] #取得發生的函數名稱 funcName = lastCallStack[ 2 ] errMsg = "File \" {} \" , line {}, in {}: [{}] {}" . format(fileName, lineNum, funcName, error_class, detail) print (errMsg) if __name__ == "__main__" : try : 111/0 except Exception as e: dump(e) Output $ ./debug.py File "./debug.py", line 26, in <module>: [ZeroDivisionError] division by zero Reference 當Exception發生時,怎麼抓它發生的位置以及詳細原因?

Python Source Code Encoding UTF-8

#!/usr/bin/env python3 # -*- coding: utf-8 -*- from selenium import webdriver from selenium.webdriver.common.by import By Python 程式碼或註解加入中文教學,設定 UTF-8 編碼 PEP 263 – Defining Python Source Code Encodings Correct way to define Python source code encoding

Selenium WebDriver

WebDriver.name 傳回瀏覽器的名稱,比如 chrome,firefox。 WebDriver.get(url) 取得網頁 WebDriver.execute_script() 執行 javascript。 WebDriver.execute_async_script() 非同步執行 javascript,主要用於執行 setTimeout()。 WebDriver.current_url 傳回目前瀏覽器上面的網址。 WebDriver.page_source 傳回目前網頁HTML原始碼。 WebDriver.close() 結束目前的視窗 WebDriver.quit() 結束所有的視窗 WebDriver.switch_to 切換焦點到某一個元件,比如 alert window,frame,webelement。 WebDriver.find_element() 找尋第一個相符合元件。 WebDriver.find_elements() 找尋所有相符合元件。 WebDriver.timeouts() 設定所有 timeout 時間。 WebDriver.set_page_load_timeout() 設定網頁載入 timeout 時間。 WebDriver.set_script_timeout() 設定執行 java script timeout 時間。 WebDriver.implicitly_wait() 看不懂英文 Reference webdriver.py

Selenium frame

browser.switch_to.frame(0) 切換到第一個 frame。 browser.execute_script("return location.href") 讀取此frame的 url。 browser.switch_to.default_content() 切換到原始網頁。 browser.switch_to.parent_frame() 回到上一層 frame,回到最上層後就一直停在最上層,不會有錯誤發生。 Reference selenium之 定位以及切换frame How to handle iFrame in Selenium

Selenium form submit part 2

source code import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC browser = webdriver . Firefox() start_time = time . time() browser . get( 'http://xxx.xxx.xxx' ) old_page = browser . find_element_by_tag_name( 'html' ) print ( "submit: " + str (time . time() - start_time)) browser . find_element_by_id( "save" ) . click() print ( "wait: " + str (time . time() - start_time)) WebDriverWait(browser, 60 ) . until( lambda browser: browser . execute_script( 'return document.readyState' ) == 'complete' ) print ( "readyState: " + str (time . time() - start_time)) WebDriverWait(browser, 60 ) . until(EC . staleness_of(old_page)) print ( "staleness: " + str (time . time() - start_time)) WebDriverWait(browser, 60 ) . until(EC . presence_of_element...

Selenium table data

HTML <table> <tr><td> 1 </td><td> 2 </td><td> 3 </td><td> 4 </td><td> 5 </td></tr> <tr><td> 6 </td><td> 7 </td><td> 8 </td><td> 9 </td><td> 10 </td></tr> <tr><td> 11 </td><td> 12 </td><td> 13 </td><td> 14 </td><td> 15 </td></tr> <tr><td> 16 </td><td> 17 </td><td> 18 </td><td> 19 </td><td> 20 </td></tr> </table> 讀取儲存格 以下指令都可以取得儲存格1 browser.find_elements_by_xpath("/html/body/table/tbody/tr[1]/td[1]")[0].text browser.find_elements_by_xpath("/html/body/table/tbody/tr[1]/td")[0].text browser.find_elements_by_xpath("//table[1]/tbody/tr[1]/td")[0].text browser.find_elements_by_xpath("//table/tbody/tr[1]/td")[0].text browser.find_el...

Selenium form submit

source code import time from selenium import webdriver def wait_for (condition_function): start_time = time . time() while time . time() < start_time + 60 : if condition_function(): print ( "wait: " + str (time . time() - start_time)) return True else : time . sleep( 0.1 ) raise Exception ( 'Timeout waiting' ) class wait_for_page_load ( object ): def __init__ ( self , browser): self . browser = browser def page_has_loaded ( self ): self . new_page = self . browser . find_element_by_tag_name( 'html' ) return self . new_page . id != self . old_page . id def __enter__ ( self ): print ( "enter: " + str (time . time() - start_time)) self . old_page = self . browser . find_element_by_tag_name( 'html' ) print ( self . old_page . id) def __exit__ ( self , * _): print ( "exit: " + str (time . time() - start_time)) wait_for( self . page_has_l...

python 的 module 模組 跟 package 套件

module 簡單來說就是一個 .py 檔案。 package 簡單來說就是一個目錄包含很多個 .py 檔案,這個目錄要存在一個 __init__.py 檔案。 package 也可以包含很多個 package。 import 用來載入 module 或 package。 dir() 用來顯示 module/package 所有的物件,包含屬性,方法,類別等。 type() 用來顯示變數的類別,比如 module,function,但是沒有 package,import 一個 package 也視為 module。 Reference 解析Python模組(Module)和套件(Package)的概念

Selenium WebElement

Command WebDriver.find_element(By.ID) 透過 id 欄位查詢網頁元件 WebDriver.find_element(By.NAME) 透過 name 欄位查詢網頁元件 WebDriver.find_element(By.CLASS_NAME) 透過 class 欄位查詢網頁元件 WebDriver.find_element(By.LINK_TEXT) 透過連結文字查詢網頁元件 WebElement.is_selected() 檢查checkbox網頁元件是否被選取 WebElement.clear() 清除網頁元件所有輸入文字 WebElement.send_keys(*value) 模擬輸入文字到網頁元件 WebElement.get_attribute() 取得網頁元件的屬性 WebElement.get_property() 取得網頁元件的屬性 Reference by.py webdriver.py webelement.py WebDriver API - WebElement 查找元素 selenium get_attribute的几种用法 what is the difference between 'property' and 'attribute' in Selenium WebElement? selenium+python自动化101-使用execute_script() 方法获取 JavaScript 返回值 【Day 20】- 讓 Selenium 去 Dcard 上自動向下捲動 (實戰 Selenium 模擬使用者划手機 2/2) 解决Selenium中用find_elements_by_xpath()无法获取属性值问题 selenium之 搞定checkbox、radiobox

selenium alert/popup window

Command alert = browser.switch_to_alert() 取得對話框物件 alert = browser.switch_to.alert 取得對話框物件 alert.accept() 按下 OK 按鈕 alert.dismiss() 按下 Cancel 按鈕 alert.text 取得對話框文字 from selenium.webdriver.support import expected_conditions expected_conditions.alert_is_present()(browser) 用來檢測是否有 alert 視窗 Demo from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.common.exceptions import TimeoutException browser = webdriver . Firefox() browser . get( "url" ) browser . find_element_by_id( "button" ) . click() try : WebDriverWait(browser, 3 ) . until(EC . alert_is_present()) alert = browser . switch_to . alert alert . accept() print ( "alert accepted" ) except TimeoutException: print ( "no alert" ) Reference alert.py WebDriver API - Alerts Check if any alert exists using selenium...

Python Selenium on Windows 10

Install(Ubuntu) python pip install selenium 驅動列表 https://github.com/mozilla/geckodriver/releases/ 下載最新 https://github.com/mozilla/geckodriver/releases/download/v0.35.0/geckodriver-v0.35.0-win32.zip 解壓 geckodriver-v0.35.0-win64.zip 到 C:\Program Files Python 安裝目錄。 解壓後有一個檔案 geckodriver.exe 這是要給 selenium 執行 firefox 的必要檔案。 Test from selenium import webdriver browser = webdriver . Firefox(executable_path = r'C:\Program Files\geckodriver.exe' ) browser = webdriver . Firefox() browser . get( 'https://trendoceans.com/blog' ) print ( 'Title: %s' % browser . title) browser . quit() 執行 webdriver.Firefox() 時要指定 geckodriver 的位置,執行完 後會跳出一個 firefox 視窗。 執行 browser.get() 後 firefox 視窗會載入網頁。 執行 browser.quit() 後會結束 firefox 視窗。 AI from selenium import webdriver from selenium.webdriver.firefox.service import Service from selenium.webdriver.firefox.options import Options # 設置 Firefox 選項 options = Options() options . headless = Fa...

Python Selenium on Ubuntu

Install sudo apt install python3-pip pip3 install selenium wget https://github.com/mozilla/geckodriver/releases/download/v0.32.2/geckodriver-v0.32.2-linux64.tar.gz tar zxvf geckodriver-v0.32.2-linux64.tar.gz 解壓後有一個檔案 geckodriver 這是要給 selenium 執行 firefox 的必要檔案。 sudo tar zxvf geckodriver-v0.32.2-linux64.tar.gz -C /usr/sbin 直接把 geckodriver 解壓到 /usr/sbin 就不用指定執行位置了。 Test from selenium import webdriver browser = webdriver . Firefox(executable_path = "./geckodriver" ) browser . get( 'https://trendoceans.com/blog' ) print ( 'Title: %s' % browser . title) browser . quit() 執行 webdriver.Firefox() 時要指定 geckodriver 的位置,執行完後會跳出一個 firefox 視窗。 執行 browser.get() 後 firefox 視窗會載入網頁。 執行 browser.quit() 後會結束 firefox 視窗。 Debug $ python3 Python 3.6.9 (default, Jan 26 2021 , 15 : 33 : 00 ) [GCC 8.4.0 ] on linux Type "help" , "copyright" , "credits" or "license" for more information . >>...

Python 函數中的冒號跟箭頭 (Type Hints)

Reference Python函数参数中的冒号与箭头 PEP 484 – Type Hints typing —— 类型注解支持 Type hints in namedtuple Python Type Hints 教學 Type Hints的野心 全面理解Python中的类型提示(Type Hints) 使用 Python typing 模組對你的同事好一點

Python 的 struct

dataclasses --- Data Classes

Python book

PDF Python 旋風之旅     online Python 教學  (官方) Python 語言參考手冊  (官方) Python 標準函式庫 (Standard Library)  (官方) Python 3 入门指南 Python 2 入门指南 简明 Python 教程 深入 Python 2  (Dive Into Python) 深入 Python 3 Python 2 基础教程 Python 3 教程 Python 旋風之旅 Python进阶  (Intermediate Python) Python教程  (廖雪峰) Python - 100天从新手到大师 Python进阶 Python进阶 Tkinter Graphical User Interfaces with Tk Tkinter 教學 Tkinter Open File Dialog Comprehension 列表推導式 Python Comprehension語法應用教學 [Python]B10─列表推導(list comprehension) urllib Python請求標準庫 urllib 與 urllib3 Python urllib3模块详解 Selenium Selenium with Python Selenium with Python中文翻译文档 Reference 为什么很多Python开发者写GUI不用Tkinter,而要选择PyQt和wxPython或其他?