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)
改用 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()
為什麼你"搜尋按鈕"的XPATH跟我不一樣@@, 我用是Chrome預設模式,直接複製的, 有沒有哪裡沒注意到, 感謝你願意回答
https://imgur.com/a/QAv8eQ8
不客氣~
用開發者工具點箭頭,再移到網頁元素上面的時候,仔細觀察會發現 svg是包在一個 div 裡面,那個 div 的外層又包著一個 a (超連結),在這個例子裡面把目標定在超連結上面比較合適。
這裡另一個問題是,這個網站用到很多ajax技術,用selenium的find_element好像會出現明明看的到網頁元素卻找不到的情況,用ActionChain處理就簡單多了~
謝謝提點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
不知道問題在哪裡 @@ 感謝回答
你現在困或的關鍵點應該是「對XPATH」的原理不熟,其實我自己也沒有很熟,只是略懂,建議你有空上網找一下XPATH相關的基礎補一下,或是問ChatGPT。
我簡單說一下我知道的XPATH的部份...
開頭帶一個斜槓的叫作絕對定位(在開發者工具裡面是叫作完整XPATH),比如說一個網頁裡面只有一個button元素,那我要定位它就是 /html/body/button
,這個適用於網架元素架構不太會變動的,舉個例子如果這個網頁今天被改成把button外層加一個div包起來,那上面的定位描述就失敗了。
開頭帶二個斜槓的我叫它匹配定位(XPATH),匹配的定位描述可以配合元素標籤、元素屬性、css類別、文字等等相當有彈性(因此也比較複雜) 用上面同網頁架構來舉個例,比方講那個button按鈕的文字是"送出",那在這邊要定位它的描述只要這樣寫 //button[@text()="送出"]
,不管是不是會有人突然把它加到div或是哪個位置,只要它的文字是"送出",就會被定位到...這邊只是粗淺的舉例,說錯莫怪。
//span[@class='TqC_a']
搜尋欄位 XPATH:
//input[@placeholder='搜尋']
span.TqC_a
搜尋欄位 CSS Selector:
input[placeholder="搜尋"]
search = driver.find_element_by_css_selector('span.TqC_a')
actions = ActionChains(driver)
actions.move_to_element(search).click().perform()