selenium学习--零碎知识总结

一、定位到元素但是click()无效

  一、使用js方法处理

    方法一:直接用webdriver的click方法,失效。

browser.find_element_by_xpath("//div[@id='map-distance']/a[4]").click()

  text方法检验输出,可以看到确实是定位到了我想要点击的元素的。迷之失效,有人理解原因的话请和我说一下。

  注意:此处用xpath定位,先用唯一的id来定位父节点,再定到子节点,子节点从1开始计数,所以是a[4]。

    方法二:调用js方法中的setAttribute方法,失效。

js2 = "var q=document.getElementById('map-distance').children[3].setAttribute('class','on')"
js3 = "var a=document.getElementById('map-distance').children[0].removeAttribute('class')"
browser.execute_script(js2)
browser.execute_script(js3)

将元素的class属性设为on,同时删除初始元素的class属性。跑代码的时候已经看到2km被选中了,然而还是失效。。JavaScript我也不太了解,实在不知道为什么。

  注意:这里的.chidren返回的是子代的列表,列表是从0开始的,所以取3。

    方法三:调用js方法中的click方法,成功!

js2 = "var q=document.getElementById('map-distance').children[3].click()"
browser.execute_script(js2)

  备注:上面可以作为统一格式来使用,方法:直接右键“Copy JS Path”,然后加上click()就可以了。

二、滚动到制定元素位置

#coding:utf-8
#__author__='wang'

#如果要定位的元素在页面的下方不可见的位置,需要对页面的滚动条进行操作,才能正确的
定位该元素

import time
from selenium import webdriver

driver = webdriver.Firefox()
driver.get('https://www.baidu.com')

driver.find_element_by_id('kw').send_keys('selenium')
driver.find_element_by_id('su').click()

time.sleep(2)

#方法一:
#将滚动条滚动到页面底部
# js = "documentElement.scrollTop=1000"#针对Firefox有效
# # js = "document.body.scrollTop=1000"#针对Chrome有效
# driver.execute_script(js)

#将滚动条滚动到页面顶部
# js = "documentElement.scrollTop=0"
# driver.execute_script(js)

#方法二:
#将滚动条滚动到可视范围内,只要能够定位该元素即可
#scrollIntoView(false):参数flase是指元素不会滚动到页面顶部,只要在View页面
显示即可
target = driver.find_element_by_xpath('//div[@id="3"]/h3/a')
# arguments[0]:指代的就是target,就是要定位的元素
driver.execute_script("arguments[0].scrollIntoView(false);",target)

time.sleep(5)

print target
target.click()

注意:scrollIntoView(false):参数flase是指元素不会滚动到页面顶部,只要在View页面显示即可

shishi = getEle(driver,20,'//*[@id="lotteryinfo"]/div[2]/div[1]/div/div[2]/div[1]/div[2]/div[2]/div[2]/div/div/span','时时彩进入游戏')
driver.execute_script("arguments[0].scrollIntoView(false);", shishi) #拖动到可见的元素去
assert shishi.text == '进入游戏'
shishi.click()

 三、动态id定位不到

<div class="layui-layer layui-layer-dialog  layer-anim" id="layui-layer10" type="dialog" times="10" showtime="0" contype="string" style="z-index: 19891024; width: 360px; top: 1px; left: 314px;"><div class="layui-layer-title" style="">提示信息</div><div id="" class="layui-layer-content layui-layer-padding" style="height: 50px;"><i class="layui-layer-ico layui-layer-ico1"></i>用户名或密码错误</div><span class="layui-layer-setwin"><a class="layui-layer-ico layui-layer-close layui-layer-close1" href="javascript:;"></a></span><div class="layui-layer-btn layui-layer-btn-"><a class="layui-layer-btn0">确定</a></div><span class="layui-layer-resize"></span></div>

1、通过绝对路径定位不到:

err = driver.find_element_by_xpath('//*[@id="layui-layer8"]/div[2]')

2、通过xpath属性定位

err = driver.find_element_by_xpath('//div[@type="dialog"]')

因该元素id是动态的,无法通过id属性进行定位,只好换成xpath.

1.通过绝对路径定位:

By.xpath("/html/body/div[3]/div[2]/div/form/div/div[5]/div/div[3]/div/div[3]/div/div/span/input[9]")----无法定位

2.通过元素索引定位:

By.xpath("//input[9]")---成功定位

顺便补上xpath的另外几种定位方式:

3.使用xpath属性定位

By.xpath("//input[@id='kw1']")

By.xpath("//input[@type='name' and @name='kw1']")

4.使用部分属性值匹配(最强大的方法)

By.xpath("//input[start-with(@id,'file')

By.xpath("//input[ends-with(@id,'_11')

By.xpath("//input[contains(@id,'_')]")

posted on 2019-03-23 15:22  echooche  阅读(60)  评论(0)    收藏  举报

导航