iT邦幫忙

1

[Python] 用Selenium 定位Instgram搜尋頁無法定位

  • 分享至 

  • xImage

Instgram(https://www.instagram.com/) 現在登入後在右邊有個搜尋的Icon,

圖:https://imgur.com/a/RIyY1Rm

這個Icon 和 點擊以後出現的搜尋欄位我用XPATH都沒辦法定位成功, 請各位不吝協助、討論

謝謝

搜尋按鈕XPATH:

XPATH:'//*[@id="mount_0_0_Rh"]/div/div/div/div[1]/div/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/div/a/div/div/div/div/svg'

Code:

#搜尋按鈕XPATH定位
search_path = '//*[@id="mount_0_0_Rh"]/div/div/div/div[1]/div/div/div/div[1]/div[1]/div[1]/div/div/div[1]/div/div[2]/div[2]/div/a/div/div/div/div/svg'
search = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, search_path))
)
search.click()

#按鈕點擊後搜尋欄位XPATH定位
searchbox_xpath = '//*[contains(concat( " ", @class, " " ), concat( " ", "x1n2onr6", " " ))]'
searchbox = WebDriverWait(driver, 10).until(
    EC.presence_of_element_located((By.XPATH, searchbox_xpath))
)
keyword = '#Car'
searchbox.send_keys(keyword)
time.sleep(1)
searchbox.send_keys(Keys.RETURN)
按檢查有看到shadowdom嗎?如果有要先到shadowroot的父元件,用javascript執行sjadowroot.click()
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
ccutmis
iT邦高手 2 級 ‧ 2023-02-16 15:40:47
最佳解答

改用 ActionChains 試試?

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.chrome.service import Service

my_ig_account="balabalabalabala@gmail.com"
my_ig_password = "abcd1234"

sleep_short = 10
sleep_long = 30

s = Service(r'./chromedriver')
chrome = webdriver.Chrome(service=s)
chrome.get('https://www.instagram.com')

action = ActionChains(chrome)

# 讓子彈飛一會兒
action.pause(sleep_short).perform()

# 登入頁面
el=chrome.find_elements(By.TAG_NAME,'input')
action.click(on_element=el[0]).send_keys(my_ig_account).send_keys(Keys.TAB).send_keys(my_ig_password).send_keys(Keys.ENTER).perform()
action.click(on_element=chrome.find_elements(By.TAG_NAME,'button')[0]).perform()

# 讓子彈再飛一會兒
action.pause(sleep_short).perform()

# 登入後若彈出一個詢問開啟通知的選單,按下"稍後再說"
btn =chrome.find_element(By.XPATH,'//button[text()="稍後再說"]')
if btn != None:
    action.click(on_element=btn).perform()

# 按下搜尋按鈕
btn =chrome.find_element(By.XPATH,'/html/body/div[2]/div/div/div/div[1]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div[2]/div[2]/div/a')
action.click(on_element=btn).perform()

# 讓子彈再多飛一會兒
action.pause(sleep_long).perform()
看更多先前的回應...收起先前的回應...
lalelee iT邦新手 4 級 ‧ 2023-02-16 17:05:15 檢舉

為什麼你"搜尋按鈕"的XPATH跟我不一樣@@, 我用是Chrome預設模式,直接複製的, 有沒有哪裡沒注意到, 感謝你願意回答
https://imgur.com/a/QAv8eQ8

ccutmis iT邦高手 2 級 ‧ 2023-02-16 17:29:16 檢舉

不客氣~

img

用開發者工具點箭頭,再移到網頁元素上面的時候,仔細觀察會發現 svg是包在一個 div 裡面,那個 div 的外層又包著一個 a (超連結),在這個例子裡面把目標定在超連結上面比較合適。

這裡另一個問題是,這個網站用到很多ajax技術,用selenium的find_element好像會出現明明看的到網頁元素卻找不到的情況,用ActionChain處理就簡單多了~

lalelee iT邦新手 4 級 ‧ 2023-02-17 09:17:58 檢舉

謝謝提點ActionChain的部分, 但我已經選到a標籤,然後複製XPATH
https://imgur.com/a/OOWa9rL
出來是這樣

//*[@id="mount_0_0_U3"]/div/div/div/div[1]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div[2]/div[2]/div/a

你定位的是這樣

/html/body/div[2]/div/div/div/div[1]/div/div/div/div[1]/div[1]/div[1]/div/div/div/div/div[2]/div[2]/div/a

不知道問題在哪裡 @@ 感謝回答

ccutmis iT邦高手 2 級 ‧ 2023-02-17 09:44:49 檢舉

你現在困或的關鍵點應該是「對XPATH」的原理不熟,其實我自己也沒有很熟,只是略懂,建議你有空上網找一下XPATH相關的基礎補一下,或是問ChatGPT。

我簡單說一下我知道的XPATH的部份...

開頭帶一個斜槓的叫作絕對定位(在開發者工具裡面是叫作完整XPATH),比如說一個網頁裡面只有一個button元素,那我要定位它就是 /html/body/button,這個適用於網架元素架構不太會變動的,舉個例子如果這個網頁今天被改成把button外層加一個div包起來,那上面的定位描述就失敗了。

開頭帶二個斜槓的我叫它匹配定位(XPATH),匹配的定位描述可以配合元素標籤、元素屬性、css類別、文字等等相當有彈性(因此也比較複雜) 用上面同網頁架構來舉個例,比方講那個button按鈕的文字是"送出",那在這邊要定位它的描述只要這樣寫 //button[@text()="送出"] ,不管是不是會有人突然把它加到div或是哪個位置,只要它的文字是"送出",就會被定位到...這邊只是粗淺的舉例,說錯莫怪。

lalelee iT邦新手 4 級 ‧ 2023-02-17 10:32:26 檢舉

謝謝我剛也試出來, 原來要選完整XPAH, 我會再來Study一下匹配定位的(XPATH) 感謝^^

lalelee iT邦新手 4 級 ‧ 2023-02-17 10:42:32 檢舉
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。 

我在W3CSCOOL 找到解釋 謝謝

ccutmis iT邦高手 2 級 ‧ 2023-02-17 10:46:23 檢舉

/images/emoticon/emoticon12.gif

0
JamesDoge
iT邦高手 1 級 ‧ 2023-02-16 20:00:23
  1. 使用更簡潔的 XPATH 定位器:
    搜尋按鈕XPATH:
//span[@class='TqC_a']

搜尋欄位 XPATH:

//input[@placeholder='搜尋']
  1. 使用 CSS Selector 定位器:
    搜尋按鈕 CSS Selector:
span.TqC_a

搜尋欄位 CSS Selector:

input[placeholder="搜尋"]
  1. 使用 ActionChains 來模擬滑鼠移動和點擊操作,例如:
search = driver.find_element_by_css_selector('span.TqC_a')
actions = ActionChains(driver)
actions.move_to_element(search).click().perform()
lalelee iT邦新手 4 級 ‧ 2023-02-17 09:24:14 檢舉

WOW~ 謝謝, 請問這種簡潔的定位方式有什麼特別的套件可以直接使用嗎 ?

我要發表回答

立即登入回答