八种元素定位方式和操作

面试官最常问到的面试题,学过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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值