1. Selenium WebDriver查找頁面元素及元素操作
1.1. 元素常用定位方法
Id name classname xpath
- 通過id定位元素:find_element_by_id("id_vaule")
- 通過name定位元素:find_element_by_name("name_vaule")
- 通過tag_name定位元素:find_element_by_tag_name("tag_name_vaule")
- 通過class_name定位元素:find_element_by_class_name("class_name")
- 通過css定位元素:find_element_by_css_selector();用css定位是比較靈活的
- 通過xpath定位元素:find_element_by_xpath("xpath")
- 通過link_text定位:driver.find_element_by_link_text("新聞").click()
- 通過partial link_text 定位:driver.find_element_by_partial_link_text("聞").click()
1.1. 定位分類總結
- Id,name,class name:為元素屬性定位
- tag_name:為元素標簽
- link text 、partial link text:為超鏈接定位(a標簽)
- Xpath:為元素路徑
- Css :為css元素選擇器定位
1.1. 定位元素
下面是百度輸入框的html代碼,可以通過firebug或者谷歌的審查元素得:
<input id="kw" class="s_ipt" autocomplete="off" maxlength="255" value="" name="wd">
1.1.1. 通過id定位:
則百度的輸入框即可表示為:find_element_by_id(“kw1”)
1.1.2. 通過name定位:
則可以表示為:find_element_by_name(“wd”)
1.1.3. 通過class_name定位元素:
driver.find_element_by_class_name("s_ipt")
1.1.1. 通過tag_name定位:
input其實就是tag_name(標簽名),
同樣也可以表示成:find_element_by_tag_name("input")
返回:符合條件的第一個標簽
可見僅僅通過標簽名去定位時,一般一種標簽在一個頁面里面會出現不止一次甚至大量出現,這種定位方式的作用不是很大,所以用的也就比較少
1.1.2. 通過css定位元素:
Id>類選擇器>標簽選擇器
cssSelector這種元素定位方式跟xpath比較類似,但執行速度較快,而且各種瀏覽器對它的支持都相當到位
一般class是用.標記,id是用#標記,標簽名直接寫具體標簽名就好
find_element_by_css_selector("#su")
find_element_by_css_selector(".s_ipt")
find_element_by_css_selector("[name=wd]"
1.1.1. 通過xpath定位元素:
XPath是一種在XML文檔中定位元素的語言。因為HTML可以看做XML的一種實現,所以selenium用戶可是使用這種強大語言在web應用中定位元素。
XPATH的值可以通過firebug或者谷歌的審查元素中:
右鍵功能:復制XPATH即可獲得。
例子:
driver.find_element_by_xpath(".//input[@id='kw']")
driver.find_element_by_xpath(".//*[@id='kw']")
其中的標簽名input也可以用*來代替,而且只要是在該標簽內,任意屬性都可以
1.1.1. 通過link_text、partial_link_text定位:
這兩種定位方式是專門用於定位超鏈接的,也就是對應html頁面中的<a>標簽,括號里傳的值就是a標簽中的超鏈接文字,兩者的區別在於一個是完整的超鏈接文字,一個是可以只寫部分超鏈接文字。
比如點擊百度首頁中右上角的新聞超鏈接,可以這樣去定位:
driver.find_element_by_link_text("新聞").click()
driver.find_element_by_partial_link_text("聞").click()
鼠標事件和鍵盤事件
https://www.cnblogs.com/mashuqi/p/10442150.html
1.1. 簡單元素操作
clear()清除文本
send_keys(*value) 模擬按鍵輸入
click()單擊元素
size 返回元素的尺寸
text 獲取元素的文本
get_attribute(name)獲取屬性值
is_displayed()設置該元素是否可見 判斷元素是否可見 是否可用 is_enable() 了解
selenium.common.exceptions.StaleElementReferenceException: Message: The element reference of <a class="mnav" href="http://news.baidu.com" name="tj_trnews"> is stale; either the element is no longer attached to the DOM, it is not in the current frame context, or the document has been refreshed
1. 鍵盤事件---(了解)
send_keys()模擬鍵盤輸入 from selenium.webdriver.common.keys import Keys
send_keys(Keys.BACK_SPACE) 刪除鍵 * send_keys(Keys.SPACE) 空格鍵(Space) * send_keys(Keys.TAB) 制表鍵(Tab) * send_keys(Keys.ESCAPE) 回退鍵(Esc) * send_keys(Keys.ENTER) 回車鍵(Enter) * send_keys(Keys.CONTROL,'a') 全選(Ctrl+A) * send_keys(Keys.CONTROL,'c') 復制(Ctrl+C) * send_keys(Keys.CONTROL,'x') 剪切(Ctrl+X) * send_keys(Keys.CONTROL,'v') 粘貼(Ctrl+V) * send_keys(Keys.F1) 鍵盤 F1 …… * send_keys(Keys.F12) 鍵盤 F12 |
1. 設置元素等待
Selenium顯示等待和隱式等待的區別 |
1.1. 顯式等待
element=WebDriverWait(driver,timeout, poll_frequency=0.5,ignored_exceptions=None).until( EC.presence_of_element_located((By.ID, "kw")) ) driver 瀏覽器驅動 timeout 最長超時時間 默認以秒為單位 poll_frequency=0.5 步長 ignored_exceptions 超時后的異常信息 默認拋noSuchElementException EC.presence_of_element_located((By.ID, "kw")) 判斷元素是否被加載在dom樹中,不代表他一定可見。 |
1.1. 隱式等待
含義:通過一定時長等待,如果超出設置的時長元素還沒有被加載,拋出NosuchException. # 設置隱式等待為 10 秒 driver.implicitly_wait(10) |
1.1. sleep休眠方法
Time.sleep(1) |
1. 瀏覽器的基本操作
選擇瀏覽器: driver = webdriver.Firefox()
打開url: driver.get(self.base_url + " www.baidu.com")
前進/后退: driver.forward()/driver.back()
刷新: driver.refresh()
最大化:browser.maximize_window()
返回當前頁面標題:print(driver.title)
返回當前頁面url:print(driver.current_url)
返回當前瀏覽器的所有窗口:driver.window_handles
返回當前瀏覽器的窗口句柄:driver.current_window_handle
選擇窗口: driver.switch_to_window(“window_name”)
對話框操作: driver.switch_to_alert() #選擇窗口對象
#瀏覽器最大化
driver.maximize_window()
#設置瀏覽區寬高
driver.set_window_size(480, 800)
截取當前頁面: driver.get_screenshot_as_file("C:/Users/Administrator/Desktop/selenium/baidu.png")
關閉瀏覽器: driver.quit()/driver.close()