Python Selenium如何點選::after的標籤?

::after的標籤位置,並不支援Click(),因此在透過find_element()後,並不能單純的直接呼叫該元件的Click()。這篇來分享一下我的作法。

先直接說結論,我的作法就是既然該位置的元件無法支援點擊,那我就改為移到該元件的「位置」進行點擊。

執行步驟

以下是幾個相關的步驟:

  1. 確認要被點擊的區域大小
  2. 找到該區域的起始位置(左上角的點)
  3. 將selenium移到該座標的右下方一點點(進入區域內),然後呼叫點擊

以下說明各細節

確認被點擊區域的大小

  1. 在瀏覽器上按「F12」,進入開發者模式
  2. 點選元件選取器,將滑鼠移到你想要點擊的位置
  3. 上面會得知該元件的區域大小,以上面這個例子來說,區域大小為「39.77 x 12」

找到該區域的起始位置

#找到該元件
element = driver.find_element(By.XPATH, '//*[@id="gpy"]/div/div[3]/div/a')

# 取得元素的座標
x = element.location['x']
y = element.location['y']

移到該座標的區域內進行點擊

from selenium.webdriver.common.action_chains import ActionChains

# 使用 ActionChains 移動到指定座標並進行點擊
actions = ActionChains(driver)
# 從上面可以知道該區域為39.77*12,因此把x與y座標任意加一個數值,落在這個區域內即可
actions.move_by_offset(x+1, y+1).click().perform()

但是上面的這個方式在執行一次時,可能結果是正確的,再呼叫一次的時候,座標就可能跑到視窗外而發生Exception了。因此,改為以下的這個方式會比較安全,讓每次的定位都以element的左上角為依歸。

from selenium.webdriver.common.action_chains import ActionChains

# 使用 ActionChains 移動到指定座標並進行點擊
actions = ActionChains(driver)
# 從上面可以知道該區域為39.77*12,因此把x與y座標任意加一個數值,落在這個區域內即可
actions.move_to_element_with_offset(element, 1, 1).click().perform()

以上就完成啦~

另外,在建立瀏覽器物件時,如果帶headless參數的話,似乎也會導致move_to_element_with_offset()與move_by_offset()沒有作用,好像要在看得到視窗的情況下才能使用。但只有觀察到這個錯誤,就先不深究相關的原因了!