首先,最重要的一条就是禁止手动输入,必须复制粘贴,必须!!!
根据元素的一个特征来定位,6种。
id: 元素的id属性。- 唯一。
class: 元素的class属性
tag: 元素的标签名
name: 元素的name属性
针对a元素:
link_text: 针对a元素的文本内容 - 完全匹配
partial_link_text: 针对a元素的文本内容 - 包含
组合元素的多种特征/关系 ,来定位。2种 - 万能定位。
xpath
css selector: css选择器
相对定位:以双斜杠开头//
相对路径:相对参照物。//相对于前面节点,如果//在表达式开头则表示相对整个html。
定位原则:
1、不依靠节点顺序和节点位置
2、只要能够找得到匹配特征的元素就可以。
定位辅助工具:
F12->elements->Ctrl+F
相对定位表达式(重点!常用!优先考虑!的方法):
1、//标签名[@属性名=值]
2、//标签名[text()=值]
3、//标签名[contains(@属性名,值)] //标签名[contains(text(),值)]
4、*标签名或者属性名都可以用*表示匹配所有 //*[contains(@*,"TopiDiscuss")]
单单一属性,无法唯一定位到元素
可以组合
逻辑:and 、 or
//标签名[text()=值 and @属性名=值 and contains(@属性名,值)]
//标签名[text()=值 or @属性名=值 or contains(@属性名,值)]
仅仅依靠元素本身的特征,已经无法唯一定位。
层级:
//祖先节点//要找的节点
//div[@id="u1"]//a[@name="tj-login"]
轴定位:
元素的兄弟姐妹、父母祖先
轴运算:
ancestor:祖先节点,包括父节点
parent:父节点
定位的某个节点/轴名称::节点
定位id=form的form节点中 子元素中name=issp的input标签
//form[@id='form']/child::input[@name='issp']
定位id=form的form节点中 祖先元素中id='wrapper的div标签
//form[@id='form']/ancestor::div[@id='wrapper']
preceding:当前元素节点标签之前的所有节点(按照html页面先后顺序)
preceding-sibling:当前元素节点标签之前的所有兄弟节点
following:当前元素节点标签之后的所有节点(按照html页面先后顺序)
following-sibling:当前元素节点标签之后的所有兄弟节点
另外一种解释:
parent::div 上层父节点,你那叫div的亲生爸爸,最多有一个;
child::div 下层所有子节点,你的所有亲儿子中叫div的;
ancestor::div 上面所有直系节点,是你亲生爸爸或者你亲爹或者你亲爹的爸爸中叫div的;
descendant::div 下面所有节点,你的后代中叫div的,不包括你弟弟的后代;
following::div 自你以下页面中所有节点叫div的;
following-sibling::div 同层下节点,你所有的亲弟弟中叫div的;
preceding::div 同层上节点,你所有的亲哥哥以及他们的后代中叫div的;
preceding-sibling::div 同层上节点,你所有的亲哥哥中叫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")