首先忘晤,最重要的一條就是禁止手動輸入宛蚓,必須復制粘貼,必須I杷F嗬簟!
根據(jù)元素的一個特征來定位,6種闰蛔。
id:?元素的id屬性痕钢。-?唯一。
class:?元素的class屬性
tag:?元素的標簽名
name:?元素的name屬性
針對a元素:
link_text:?針對a元素的文本內(nèi)容?-?完全匹配
partial_link_text:?針對a元素的文本內(nèi)容?-?包含
組合元素的多種特征/關系?序六,來定位任连。2種?-?萬能定位。
xpath
css?selector:?css選擇器
相對定位:以雙斜杠開頭//
相對路徑:相對參照物例诀。//相對于前面節(jié)點随抠,如果//在表達式開頭則表示相對整個html。
定位原則:
1繁涂、不依靠節(jié)點順序和節(jié)點位置
2拱她、只要能夠找得到匹配特征的元素就可以。
定位輔助工具:
F12->elements->Ctrl+F
相對定位表達式(重點扔罪!常用椭懊!優(yōu)先考慮!的方法):
1步势、//標簽名[@屬性名=值]
2、//標簽名[text()=值]
3背犯、//標簽名[contains(@屬性名,值)]? ? ? ? ? ?//標簽名[contains(text(),值)]
4坏瘩、*標簽名或者屬性名都可以用*表示匹配所有? ? ? ?//*[contains(@*,"TopiDiscuss")]?
單單一屬性,無法唯一定位到元素
可以組合
邏輯:and? 漠魏、? or
//標簽名[text()=值 and??@屬性名=值? and??contains(@屬性名,值)]
//標簽名[text()=值 or? @屬性名=值? or? contains(@屬性名,值)]
僅僅依靠元素本身的特征倔矾,已經(jīng)無法唯一定位。
層級:
//祖先節(jié)點//要找的節(jié)點
//div[@id="u1"]//a[@name="tj-login"]
軸定位:
元素的兄弟姐妹、父母祖先
軸運算:
ancestor:祖先節(jié)點哪自,包括父節(jié)點
parent:父節(jié)點
定位的某個節(jié)點/軸名稱::節(jié)點
定位id=form的form節(jié)點中 子元素中name=issp的input標簽
//form[@id='form']/child::input[@name='issp']
定位id=form的form節(jié)點中 祖先元素中id='wrapper的div標簽
//form[@id='form']/ancestor::div[@id='wrapper']
preceding:當前元素節(jié)點標簽之前的所有節(jié)點(按照html頁面先后順序)
preceding-sibling:當前元素節(jié)點標簽之前的所有兄弟節(jié)點
following:當前元素節(jié)點標簽之后的所有節(jié)點(按照html頁面先后順序)
following-sibling:當前元素節(jié)點標簽之后的所有兄弟節(jié)點
另外一種解釋:
parent::div 上層父節(jié)點丰包,你那叫div的親生爸爸,最多有一個壤巷;
child::div 下層所有子節(jié)點邑彪,你的所有親兒子中叫div的;
ancestor::div 上面所有直系節(jié)點胧华,是你親生爸爸或者你親爹或者你親爹的爸爸中叫div的寄症;
descendant::div 下面所有節(jié)點,你的后代中叫div的矩动,不包括你弟弟的后代有巧;
following::div 自你以下頁面中所有節(jié)點叫div的;
following-sibling::div 同層下節(jié)點悲没,你所有的親弟弟中叫div的篮迎;
preceding::div 同層上節(jié)點,你所有的親哥哥以及他們的后代中叫div的示姿;
preceding-sibling::div 同層上節(jié)點甜橱,你所有的親哥哥中叫div的;
代碼示例:
from timeimport sleep
# 引入第三方庫
from seleniumimport webdriver
# 打開瀏覽器 - 指令1 - 開啟與瀏覽器之間的會話峻凫。
driver = webdriver.Chrome()
# 最大化窗口
driver.maximize_window()
# 訪問百度首頁 - 指令2
driver.get("http://www.baidu.com")
# 合并寫法
driver.find_element_by_id("kw").send_keys("selenium webdriver")
# class
ele = driver.find_element_by_class_name("s_ipt")# 只支持一個class值
eles = driver.find_elements_by_class_name("s_ipt")
# tag_name
driver.find_element_by_tag_name("input")
driver.find_elements_by_tag_name("input")
# name
driver.find_element_by_name("wd")
driver.find_elements_by_name("wd")
# link_text? partial_link_text
driver.find_element_by_link_text("hao123")
driver.find_elements_by_link_text("hao123")
driver.find_element_by_partial_link_text("123")
driver.find_elements_by_partial_link_text("123")
sleep(7)
# 關閉當前窗口渗鬼。
driver.close()
# 關閉瀏覽器,關閉會話荧琼。
driver.quit()
xpath表達式
driver.find_element_by_xpath('//div[@id="u1"]//a[@name="tj_login"]').click()
css定位
driver.find_element_by_css_selector('div#u1 a[name="tj_login"]').click()
# 找到登陸按鈕譬胎,并點擊,彈出登陸窗口
loc = (By.XPATH,'//div[@id="u1"]//a[@name="tj_login"]')
driver.find_element(*loc).click()
# 元素表達
loc = (By.ID,'TANGRAM__PSP_11__footerULoginBtn')
# 等待 - 等待元素可見命锄。
wait.until(EC.visibility_of_element_located(loc))
# 在登陸的窗口當中堰乔,點擊? 用戶名登陸
driver.save_screenshot("登陸窗口.png")# 截圖
driver.find_element(*loc).click()
# 等待用戶名輸入框可見,然后輸入用戶名
loc = (By.ID,"TANGRAM__PSP_11__userName")
ele = wait.until(EC.visibility_of_element_located(loc))
print("等待元素可見的返回對象是:",ele)
driver.find_element(*loc).send_keys("123456789")