元素定位(二)

一.实例

如何定位到下图第二个"抢投标",有一种方法是利用xpath定位 //a[@href="/loan/loan_detail/Id/7190.html" and text()="抢投标"],但是我们注意到,这个链接中的7190是id值,而页面中的id值是可以变化的,因此当标变化时,我们又得重新写xpath定位表示式了,那么,有没有一种更好的方式来解决这个问题,这就需要用到xpath的轴定位

二、xpath-轴定位语法

1.轴运

轴名称 描述
ancestor 祖先节点,包括父
parent 父节点
preceding

当前元素节点标签之前的所有节点。(html页面的先后顺序)

preceding-sibling 当前元素系欸但标签之前的所有兄弟节点
following 当前元素标签之后的所有节点(html页面的先后顺序)
following-sibling 当前元素系欸但标签之后的所有兄弟节点

 

 

 

 

 

2.使用语法

轴名称::节点名称

例子://div//table//td/preceding::td

3. 应用场景:页面显示为一个表格样式的数据列,需要通过组合来定位元素

实例:定位前程贷的"抢投标"

三、framea框架里面元素定位

frame:一个网页里面嵌套了另外一个框架/页面

1.如果我们需要切换到你想要的内嵌页面上去,就需要定位到frame框架,然后切换过去,切换用到的方法:driver.switch_to.frame(),然后可以自己去定位框架的元素,去进行对应的操作

2.当iframe上的操作完后,想重新回到主页面上操作元素,这时候,就可以用driver.switch_to.default_content()

举例:腾讯课堂登录

from selenium import webdriver
import time
drive = webdriver.Chrome()
drive.get("https://ke.qq.com/")
drive.maximize_window()
drive.find_element_by_id("js_login").click()
time.sleep(3)
drive.find_element_by_xpath('//a[@class="js-btns-enter btns-enter btns-enter-qq"]').click()
time.sleep(3)
drive.switch_to_frame("login_frame_qq")
drive.find_element_by_xpath('//a[text()="帐号密码登录"]').click()
# drive.find_element_by_id("switcher_plogin").click()
drive.find_element_by_id("u").send_keys("825528598")
drive.find_element_by_id("p").send_keys("fumeiwoaini2016")
drive.find_element_by_id("login_button").click()
time.sleep(3)
drive.switch_to.default_content()
drive.quit()

四、滚动条之后的元素定位

方法一:使用js脚本拖动到指定的地方

第一步:找到这个元素

target=driver.find_element_by_id("id_keypair")

第二步:利用js拖动到可见区域

driver.execute_script("arguments[0].scrollIntoView();",target)

from selenium import webdriver
import time
#关闭Chrome提示框
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
drive = webdriver.Chrome(chrome_options=option)
#隐性等待
drive.implicitly_wait(50)

#死等待
# time.sleep(3)

drive.get("https://www.baidu.com/")
drive.maximize_window()
drive.find_element_by_id("kw").send_keys("selenium")
drive.find_element_by_id("su").click()

#滚动操作1、找到这个元素
target1 = drive.find_element_by_xpath('//div[@class="result c-container " and @id="7"]/h3/a')
#2、执行Js语句,滚动页面,底部对齐
drive.execute_script("arguments[0].scrollIntoView(false);",target1)
#3、对元素进行操作
target1.click()
drive.quit()

 

方法二:根据页面显示进行变通,发送tab键

根据页面显示进行变通,发送tab键

例如:百度搜索结果—定位到滚动条滚动之后的某个链接。

 

拓展

1.移动到元素element对象的“底端”与当前窗口的“底部”对齐

当网页顶部有固定遮罩层,就需要滚动元素到页面底部

drive.execute_script("arguments[0].scrollIntoView(false);",element)

2.移动到元素element对象的“顶端”与当前窗口的“顶部”对齐

drive.execute_script("arguments[0].scrollIntoView();",element)

 

3.滚动到顶部:

js="vars=document.documentElement.scrollTop=0"

driver.excute_script(js)

或者

driver.excute_script("window.scrollTo(document.body.scrollHeight,0)

4.滚动到底部:

js="vars=document.documentElement.scrollTop=100000"

driver.excute_script(js)

或者

driver.excute_script("window.scrollTo(0,document.body.scrollHeight)

 

posted @ 2018-09-05 17:08  sinder2018  阅读(37)  评论(0)    收藏  举报