【selenium】元素定位
阿新 • • 發佈:2022-04-07
元素定位
Selenium提供了8種定位方式1 id 2 name 3 classname 4 tag name 5 link text 6 partial link text 7 xpath 8 css selector
定位一個元素 定位多個元素 含義 find_element_by_id find_elements_by_id 通過元素id定位 find_element_by_name find_elements_by_name 通過元素name定位 find_element_by_class_name find_elements_by_class_name 通過classname進行定位 find_element_by_tag_name find_elements_by_tag_name 通過標籤定位 find_element_by_link_text find_elements_by_link_tex 通過完整超連結定位 find_element_by_partial_link_text find_elements_by_partial_link_text 通過部分連結定位 find_elements_by_css_selector find_elements_by_css_selector 通過css選擇器進行定位 find_element_by_xpath find_elements_by_xpath 通過xpath表示式定位
根據id、name、classname元素定位 模擬輸入
# 根據id查詢元素,.send_keys 輸入資訊 selenium chrome_browser.find_element_by_id('kw').send_keys('selenium') # 根據name查詢元素,找到並輸入 webdriver chrome_browser.find_element_by_name('wd').send_keys('webdriver') # 根據class查詢元素,並輸入資訊 hello worldchrome_browser.find_element_by_class_name("s_ipt").send_keys('hello world')
tag_name 標籤名定位
# 根據標籤name查詢元素 chrome_browser.find_elements_by_tag_name('input')
link_text 文字連結定位元素
# 根據link_text定位元素 準確定位 標籤需要是<a></a>才能定位到 chrome_browser.find_element_by_link_text("新聞") # 根據link_text定位元素 模糊定位 標籤需要是<a></a>才能定位到 chrome_browser.find_element_by_partial_link_text("漲價") # 元素定位 模擬使用者點選 chrome_browser.find_element_by_link_text("貼吧").click()
根據id、class元素定位 模擬點選
# 根據id查詢元素,模擬使用者進行點選 chrome_browser.find_element_by_id('su').click() # 根據class name查詢元素,模擬使用者進行點選 chrome_browser.find_element_by_class_name('s_btn').click()
def baidu_selenium(self): """ 百度搜索selenium """ driver = webdriver.Chrome() # 開啟Google瀏覽器 driver.implicitly_wait(5) # 未找到控制元件時 隱式等待5s driver.get("http://www.baidu.com") # 開啟網址 print("頁面標題:", driver.title) print("頁面url:", driver.current_url) time.sleep(3) # 強制等待3s input_box = driver.find_element_by_class_name("s_ipt") # class 元素定位 input_box.send_keys("selenium") # 模擬使用者輸入 print("元素 標籤名:", input_box.tag_name) print("元素 位置:", input_box.location) print("元素 大小:", input_box.size) print("selenium_id:", input_box.id) print("獲取id屬性:", input_box.get_attribute("id")) print("獲取name屬性:", input_box.get_attribute("name")) print("獲取class屬性:", input_box.get_attribute("class")) time.sleep(5) # 強制等待5s baidu_button = driver.find_element_by_id('su') # id 元素定位 baidu_button.click() # 模擬使用者點選 print("獲取id屬性:", baidu_button.get_property("id")) print("獲取class屬性:", baidu_button.get_attribute("class")) time.sleep(5) driver.find_element_by_name("wd").clear() # name 元素定位 模擬使用者清空輸入框 time.sleep(5) driver.quit() # 關閉瀏覽器示例
Xpath
表示式 描述 nodename 選取此節點的所有子節點。 / 從根節點選取(取子節點)。 // 從匹配選擇的當前節點選擇文件中的節點,而不考慮它們的位置(取子孫節點)。 . 選取當前節點。 .. 選取當前節點的父節點。 @ 選取屬性。
* 匹配任何元素節點
@* 匹配任何屬性節點
node() 匹配任何型別的節點
參考連結:https://www.runoob.com/xpath/xpath-tutorial.html
1、child 選取當前節點的所有子元素 2、parent 選取當前節點的父節點 3、descendant 選取當前節點的所有後代元素(子、孫等) 4、ancestor 選取當前節點的所有先輩(父、祖父等) 5、descendant-or-self 選取當前節點的所有後代元素(子、孫等)以及當前節點本身 6、ancestor-or-self 選取當前節點的所有先輩(父、祖父等)以及當前節點本身 7、preceding-sibling 選取當前節點之前的所有同級節點 8、following-sibling 選取當前節點之後的所有同級節點 9、preceding 選取文件中當前節點的開始標籤之前的所有節點 10、following 選取文件中當前節點的結束標籤之後的所有節點 11、self 選取當前節點 12、attribute 選取當前節點的所有屬性 13、namespace 選取當前節點的所有名稱空間節點
切換frame
# find_element_by_id()或find_element_by_class_name() driver.switch_to.frame("xxx") # 從子frame切換到父級frame (多重父級需要多個語句返回先輩節點) driver.switch_to.parent_frame() # 將焦點切換到預設frame (多重父級單條返回先輩節點) driver.switch_to.default_content()
切換選項卡
all_tab = driver.window_handles # 獲取所有選項卡 ,all_tab 型別為 list print(all_tab) time.sleep(3) driver.switch_to.window(all_tab[1]) # 切換選項卡 print(driver.title)
def tieba(self): """ 貼吧 """ driver = webdriver.Chrome() driver.get("http://www.baidu.com") driver.find_element_by_link_text("貼吧").click() all_tab = driver.window_handles # 獲取所有選項卡 print(all_tab) time.sleep(3) driver.switch_to.window(all_tab[1]) # 切換選項卡 print(driver.title) driver.find_element_by_link_text("百度首頁").click() # 對貼吧進行操作 time.sleep(3) driver.switch_to.window(driver.window_handles[0]) # 再次切換選項卡 print(driver.title) time.sleep(5) driver.find_element_by_id("kw").send_keys("微博") # 對百度進行搜尋 time.sleep(3) driver.find_element_by_id("su").click() time.sleep(5) driver.quit()示例
執行結果: