面试官最常问到的面试题,学过selenium吗,selenium元素定位有几种方式,分别是什么。
你最喜欢用的元素定位方式是什么?你只能从CSS_SELECTOR、XPATH中二选一
这是自动化最核心的知识,我们要学会模拟用户的操作,即元素的定位和元素的操作。
元素定位有几种方式:ID、NAME、CLASS_NAME、TAG_NAME、LINK_TEXT、PARTIAL_LINK_TEXT、CSS_SELECTOR、XPATH。
1、ID和NAME
ID和NAME可以看作一组,
他们定位元素比较简单,但是 很多元素没有ID 和NAME属性。
driver.find_element_by_id("id_login").send_keys("changcheng1211")
driver.find_element(By.ID,"id_password").send_keys("changcheng1211")
driver.find_element(By.NAME,"wd").send_keys("百度一下")
driver.find_element_by_name("wd").send_keys("百度一下")
2、CLASS_NAME和TAG_NAME
CLASS_NAME大部分元素都有class属性,但是网页中经常会有多个元素拥有相同的class,这时用class属性只能第一个元素
driver.find_element_by_class_name("primaryAction").submit()
TAG_NAME标签名,类似于class属性,每个元素都有标签名,但是网页中经常会有多个元素拥有相同的标签名。
比如一个网页有100个连接,这100个连接可能都是<a>标签,所以他们标签名相同,也是只能定位到第一个a标签
driver.find_element(By.TAG_NAME,"a")
3、LINK_TEXT和PARTIAL_LINK_TEXT
LINK_TEXT:链接文本,特点:只适用于<a>标签或者<a>标签的子元素的文本,不适用于所有的元素。
PARTIAL_LINK_TEXT :部分链接文本。LINK_TEXT只适用于完整链接文本。PARTIAL_LINK_TEXT不但适用于完整链接文本,还可以通过链接文本的一部分进行定位,只要这部分的文字在页面中是唯一的即可
login.find_element_by_partial_link_text('我的媒体').click()
4、CSS_SELECTOR
CSS_SELECTR几乎可以定位页面中所有的元素。
#号表示id
login.find_element_by_css_selector('#id_login').click()
小数点表示calss
driver.find_element(By.CSS_SELECTOR,'.popup-main li').click()
标签名直接写,在CSS语言中,用标签名定位元素不需要任何符号标识,直接使用标签名即可。但是标签名重复的概率非常大,所以很难通过这种方式找到想要的元素。
find_element_by_css_selector('input')
根据任意属性定位元素,比如根据title定位,在属性两边加上中括号
driver.find_element(By.CSS_SELECTOR,"[title='上传媒体']")
父元素和子孙元素之间用大于号表示
find_element_by_css_selector('span>input')
祖先元素和子孙元素之间用空格表示
<form id="username">
<div>
<input type="text" />
<div>
</form>
如何定位中间的input标签?
driver.find_element(By.CSS_SELECTOR,"#username input")
更多CSS_SELECTOR定位请看
css selector 元素定位_cssselector定位元素-CSDN博客
5、XPATH
5.1 根据绝对路径
所有的元素,都一定有一个唯一的路径,这种方法几乎是万能的,可以作为定位元素的最后手段。
login.find_element_by_xpath('/html/body/div/div[2]/div[1]/div/a[1]/div')
缺点:绝对路径太长,代码不够美观
网页前端的需求变更,
一旦页面发生变化,
xpath结构非常容易受到影响
5.2 根据任意属性定位 元素
driver.find_element(By.XPATH,"//标签名[@属性名='属性值']")
比如
driver.find_element(By.XPATH,'//input[@id="kw"]')
5.3 根据父元素定位子元素
如要定位里面的input输入
<form id="username">
<div>
<input type="text"/>
</div>
</form>
driver.find_element(By.XPATH,"//form[@id='username']/div/input")
6 元素定位常见面试题
面试官最常问道的面试题,学过selenium吗,selenium元素定位有几种方式,分别是什么。
你最喜欢用的元素定位方式是什么?
你只能从CSS_SELECTOR、XPATH中二选一。
两者比较起来,
6.1 css定位元素的速度稍微快一点
如果用例数量比较大的情况,css明显比xpath快。
开发人员通过css选择器给网站添加样式。
所有的浏览器都支持css,并且对css选择器有优化。
并不是所有的浏览器都原生支持xpath,早期的i.e.对xpath的支持比较差,有时运行很慢,甚至无法运行,所以xpath的兼容性不太好。
6.2 xpath的定位方式比css更灵活
它可以根据标签对之间的文本定位元素。
login.find_element_by_xpath('//span[text()="我的媒体"]').click()
xpath允许从子元素定位父元素
例定位父元素,先根据id定位 子元素,再查找父元素,..表示父节点,那么如何定位a标签
<a target="_blank">
<span id="login>登录</span>
</a>
可以这样
//span[@id="login"]/..
login.find_element_by_xpath('//span[text()="文艺片1"]/../input')
如何定位兄弟元素,如先根据id定位子元素,再查找父元素,再input标签,..表示父节点。
<div>
<span id="login">登录</span>
<input />
</div>
login.find_element_by_xpath('//span[@id="login"]/../input')
7、元素的操作
7.1 click()
点击操作
login.find_element_by_xpath('//span[text()="我的媒体"]').click()
7.2 send_keys()
driver.find_element_by_id("id_login").send_keys("changcheng1211")
7.3 clear()
清空操作,在执行修改功能时,有些输入框长有默认值,我们可以通过clear()方法先清空,再用send_keys输入新值
login.find_element_by_id('id_title').clear()
7.4 submit()
提交操作,类似于click()方法,submit()方法是一个提交网页表单的动作。
常见的网页表单有那些?比如登录功能、百度操作功能、注册功能、几乎所有由几个输入框和一两个按钮组成的页面都是网页表单。
表单中的任何一个元素都可以用来提交表单。
driver.find_element_by_class_name("primaryAction").submit()
7.5 ActionChains
ActionChains中封装了所有可以对页面元素进行的高级操作,可以用click()方法来模拟鼠标的单击操作,这些方法封装在ActionChains类中。
常见模拟鼠标的操作:双击、 右键点击、长按、鼠标悬停、键盘特殊按键。
ActionsChains(driver)
Action是动作行为的意思
Chains是链表的意思
driver代表了当前的浏览器
合起来就是,把当前浏览器转换为一个可以执行各种操作的行为链
1、鼠标右击操作
#定位到要右击的元素
right_click=driver.find_element_by_id(“xx”)
#对定位到的元素执行鼠标的右键操作
ActionsChains(driver).context_click(richt_click).perform()
2、鼠标双击操作
#定位到要悬停的元素
double_click=driver.find_element_by_id("xx")
#对定位到的元素执行双击操作
ActionChains(driver).double_click(double_click).perform()
3、鼠标拖放操作
drag_and_drop(source,target)在源元素上按住鼠标左键,然后移动到目标元素上释放。
source: 鼠标拖动的源元素。
target: 鼠标释放的目标元素。
#定位元素的原位置
element=driver.find_element_by_id("xx")
#定位元素要移动到的目标位置
target=driver.find_element_by_id("xx")
#执行元素的拖放操作
ActionChains(driver).drag_and_drop(element,target).perform()
其他的一些操作如下:
ActionChains(driver).click() 鼠标左键单击
ActionChains(driver).send_keys() 模拟键盘发送按键
ActionChains(driver).double_click() 鼠标左键双击
ActionChains(driver).click_and_hold() 鼠标左键单击并且保持住
ActionChains(driver).release() 释放,和上一个配合使用
ActionChains(driver).context_click() 表示鼠标右键单击
ActionChains(driver).drag_and_drop() 拖拽
ActionChains(driver).drag_and_drop_by_offset() 拖拽到某一个偏移的像素
ActionChains(driver).key_up() 摁下键盘上是的某个键
ActionChains(driver).key_down() 抬起键盘上的某个键
ActionChains(driver).move_to_element() 鼠标移动到某一个元素
ActionChains(driver).move_to_element_with_offset() 鼠标移动到某一个元素类的某一个像素
ActionChains(driver).pause() 暂停
ActionChains(driver).move_to_element(video).pause(1) 移动到某个元素上悬停
ActionChains(driver).perform() 开始按照顺序去执行操作,重要,所有的ActionChains最后都要有的操作。
这两个方法可以用来发送一些组合键
比如:ctrl+x
ActionChains(driver).key_up(“ctrl”)
ActionChains(driver).key_up(“x”)
7.6 键盘事件
Keys()类提供了键盘上几乎所有按键的方法。Send_keys()方法可以用来模拟键盘输入,除此之外,我们还可以用它来输入键盘上的按键。甚至组合键,如CTRL+A,ctrl+C等。
from selenium import webdriver
#引入Keys模快
from selenium.webdriver.common.keys import Keys
driver=webdriver.Firefox()
driver.get("http://www.baidu.com")
#輸入框輸入内容
driver.find_element_by_id("kw").send_keys("seleniumm")
#刪除多輸入的一個m
driver.find_element_by_id("kw").send_keys(Keys.BACK_SPACE)
#輸入空格鍵+”教程“
driver.find_element_by_id("kw").send_keys(Keys.SPACE)
driver.find_element_by_id("kw").send_keys("教程")
#ctrl+a全選輸入框内容
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
#ctrl+x剪切輸入框内容
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'x')
#ctrl+v粘貼内容到輸入框
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'v')
#通過回車鍵來代替單擊操作
driver.find_element_by_id('su').send_keys(Keys.ENTER)
driver.quit()
from selenium.webdriver.common.keys import Keys
在使用鍵盤按鍵方法前需要先導入keys類。
以下為常用的鍵盤操作:
send_keys(Keys.BACK_SPACE) 刪除鍵(BackSpace)
send_keys(Keys.SPACE) 空格鍵(Space)
send_keys(Keys.TAB) 制表鍵(Tab)
send_keys(Keys.TAB*5) 制表鍵(Tab)*5
send_keys(Keys.ESCAPE) 回退鍵(Enter)
send_keys(Keys.ENTER) 回車鍵(ESC)
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