AD

2025-03-16

Chrome 開發者工具 console 拿 xpath 階層下所有元素的 text

每個人習慣的抓 xpath 的插件不太一樣。
但是假如不想用任何插件,Chrome 的開發人員工具其實很夠用了。
像是大家都知道的,在開發人員工具 > console 中輸入:

  $x("//*[text()='隨便一個範例的 xpath']") 

可以用來確認 xpath 是否有選到元素、選到幾個元素等。

要確認文字也很容易,一般只要「這個」xpath 本身的文字的話,直接看 element 就可以了,但確認的場景可能是想取得這個 xpath 下「所有階層」的文字。
可以像這樣:

$x("xpath").map(el => el.innerText || el.textContent);

至於 innerText 和 textContent 有什麼差異,可能之後再筆記一下。

2025-03-01

[Mac] Python venv 設定

1. 到你想要放 venv 的路徑
2. python venv venv_name 
(看你 python 怎麼裝,可能要 python3 -m venv venv_name)
這樣就有叫 venv_name 的資料夾了
3. source venv_name/bin/activate
就可以使用這個 venv

deactivate可以離開

2024-12-18

Selenium Chrome WebDriver 進行定位模擬

直接上範例 code:
from selenium import webdriver
import time

# 設定位置的經緯度,以大慶夜市為例
latitude = 24.122629
longitude = 120.655638
accuracy = 10

driver = webdriver.Chrome()

# 用 CDP command 設定座標經緯度
driver.execute_cdp_cmd(
    "Emulation.setGeolocationOverride",
    {
        "latitude": latitude,
        "longitude": longitude,
        "accuracy": accuracy
    }
)

# 打開頁面試試看定位,這裡以 OpenStreetMap 為例
driver.get("https://www.openstreetmap.org/")
driver.find_element("css selector", "span.geolocate").click()

# 給你看個10秒
time.sleep(10)

driver.quit()
Emulation.setGeolocationOverride 中的 latitude、longitude、accuracy 對於定位來說都是「必要」參數,雖然官方文件寫 optional,但也特別說缺少任一個,定位就不會作用XD

latitude、longitude 分別是緯度和經度,沒什麼問題。比較需要解釋的是 accuracy 定位精確度,通常帶1或以上即可。accuracy 的單位是公尺,「越小越準確」。但最好不要為0,0是不準確時回傳的(有些網站可以接受,也有些不接受)。

因為定位通常由系統回傳,我找到了Android 取得 accuracy 的文件,解釋了定位精確度。簡單來說,從經緯度的點為中心,畫一個半徑等於此精準度的圓,實際位置有 68% 的機率落在該圓內。(iOS 似乎不是這樣定義,不過總體來說也是越小越精確。)

直接以 OpenStreetMap 為例,當 accuracy 是10的時候,我還知道我在大慶夜市的哪個攤位:


當 accuracy 是100,定位超級飄,在這個圈圈裡都可能是實際定位,我可能根本不在大慶夜市裡了:

同場加映,accuracy 是 0,OSM 可以定位:

沒有 accuracy,提示:Geolocation error: position unavailable.


另外補充:
  • 模擬定位在 headless (無頭)模式也可以正確定位,之前看到一些資訊說不行,那很可能是其他問題。
  • web driver 如果禁用定位,例如 options 時禁用:
    options.add_experimental_option(
        "prefs", {"profile.default_content_setting_values.geolocation": 2}
    )
    模擬定位就不能使用。
  • 可以先用 CDP command 加上權限:
    driver.execute_cdp_cmd(
        "Browser.grantPermissions",
        {
        "permissions": ["geolocation"],
        } )
    再設定定位。
  • Google Maps 也可以使用這樣來定位。有些資訊說 Google Maps 以 IP 定位,但實際上是剛載入時抓 IP 位置的國家(OSM也會這樣),而當要精確定位目前位置時,會使用裝置位置,也就是 Emulation.setGeolocationOverride 模擬的座標。
-

目前 Chrome 的許多開發者工具都可以透過 CDP(Chrome DevTools Protocol) 指令來完成。具體有哪些功能可以看看官方文件:https://chromedevtools.github.io/devtools-protocol/


2024-11-28

Postman (newman) 到 Github actions 上的一些小記錄

前陣子遇到一個需求,團隊的 API 測試放在 postman 上,所以想要試試讓 Postman 放在 Github Actions 上面執行。當時花蠻多時間的,紀錄一些過程。
 
1. 在 Postman CLI 和 Newman 做選擇
 
Postman CLI 是官方提供的 CLI 套件,而 Newman 是社群維護的。
一開始我先用了 Postman CLI。
畢竟是官方提供,整合做得很好。有些 API 測試時需要上傳的檔案,有在 postman 上傳過並儲存在 postman cloud 的話,都可以直接使用。而測試結果直接顯示在 Postman 的 Runs 裡面——
沒想到這竟然是個缺點,它的 reporter 不能自訂,唯一的 report 就是要去剛剛提到的 Runs 裡面看,不然就是直接來自執行時的 CLI ⋯⋯(來源參考 https://community.postman.com/t/postman-cli-reporting/66763)
 
所以就因為 Newman 可以自訂 reporter,直接選了 Newman XDDDD
 
2. 上傳檔案的測試
 
用了 newman 也不是就一帆風順。
比方上傳檔案的話有點麻煩,要匯出 collection 之後填上檔案路徑。
這比起用 Postman CLI 麻煩多了。原先在 postman 改完 collection 裡的任何部分之後執行就能生效。但為了讓 Newman 上傳檔案,用匯出的 collection 就沒辦法了QQ
 
3. 執行失敗的 log
 
當時還有一點痛苦的,就是失敗時沒有 response 的 log ⋯⋯Postman CLI 也一樣。
可以做到的方法大致上是在每一個 API 的 post-script 加上紀錄:
pm.test("Response status code is 200", function () {
    if (pm.response.code !== 200) {
        throw new Error(`Response Code: ${pm.response.code} | Response Body: ${pm.response.text()} | Request Body: ${JSON.stringify(pm.request.body)}`);
    }
    pm.response.to.have.status(200);
});;


總之成功在 Actions 上跑了一段時間,不過後來還是決定換成自己寫的 API 框架了。謹此紀念沒跑多久的 Postman 上 Github Actions 經歷XDD

2024-11-25

Selenium 4.6 之後你真的不用下載 webdriver 或使用 WebDriverManager

如題。

在 Selenium 4.6 之後,已經不用另外下載 webdriver,不用帶路徑,不用使用 WebDriverManager 解決下載和帶路徑的問題。

你只需要:

from selenium import webdriver
driver = webdriver.Chrome()
這樣就可以跑了!預設是目前的 stable 版本。

-

如果你需要特定版本的 chrome,可以用Options指定,selenium manager 會自動下載你指定的版本:

options = webdriver.ChromeOptions()
options.browser_version = '120'
driver = webdriver.Chrome(options=options)

除了特定版本號,也可以帶標籤如stable(目前 CfT 版本)、beta(下一個版本穩定)、dev(目前正在開發版本)、canary(為開發人員每晚建置)、esr(擴充支援版本,僅用於 Firefox)。

如果文章有幫助到你可以在 LikeCoin 上幫我拍手喔