1月11日学习内容整理:请求库selenium之选择器,等待元素被加载

首先引入:

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By #按照什么方式查找,By.ID,By.CSS_SELECTOR
from selenium.webdriver.common.keys import Keys #键盘按键操作
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait #等待页面加载某些元素

 

driver = webdriver.Chrome()

注意:

》》find_element     永远是找第一个符合要求的标签

》》find_elements    是找所有符合要求的标签,列表形式输出

》》可以简写为find_element(By.ID,'kw')  这样的形式

1、通过id值

input_tag=driver.find_element_by_id("xxx")   得到的也是一个selenium对象

2、通过文本值

login=driver.find_element_by_link_text('登录')             查找文本值为登录的标签

login.click()     点击查找到的标签

3、通过文本值的模糊匹配

login=driver.find_element_by_partial_link_text('登')     查找文本值包含登的标签

4、通过class值

login_for_user=driver.find_element_by_class_name('xxx')   查找class值为xxx的第一个标签

5、通过标签名

driver.find_element_by_tag_name('a')    查找第一个a标签

6、通过name属性值

input_user=driver.find_element_by_name('user')   查找name属性值为user的第一个标签

 

补充1:

返回的selenium对象的属性和方法

# 打印标签名
print(input_tag.tag_name)

# 打印标签的name属性值,就是获取标签的所有属性或者某个属性值
print(input_tag.get_attribute('name'))

# 打印标签的文本值
print(input_tag.text)

# 打印标签的id值
print(tag.id)

# 打印标签的坐标位置,通常用在图片标签中,返回字典,key分别是x和y,可以用
# ['x']或者['y']取值
print(tag.location)

# 打印标签的尺寸,返回字典,key分别是width height,可以用key取value值 print(tag.size)

 

补充2:

之前我们用的WebDriverWait是显性等待,每次要有写wait.until,而隐形等待则不需要

隐形等待:3同样代表等待时间3秒

driver.implicitly_wait(3) #使用隐式等待

 

 

7、xpath:比起上述6个定位更精准

(1)//和/://代表从整篇文档中查找,所有的元素;/代表从开头找,第一个子元素,找不到就报错

driver.find_element_by_xpath('//body/a')  
# 开头的//代表从整篇文档中寻找,body之后的/代表body的儿子,这一行找不到就会报错了

driver.find_element_by_xpath('//body//a')  
# 开头的//代表从整篇文档中寻找,body之后的//代表body的子子孙孙

(2)获取第几个元素:一定注意这里找第几个就写几,不代表索引

res1=driver.find_elements_by_xpath('//body//a[1]') #取第一个a标签

(3)按照属性查找:用到中括号[  ],前面要加@,再写属性名=属性值,遇到模糊查询时要用到contains函数就可以了

res2=driver.find_element_by_xpath('//a[@href="image5.html"]')

#模糊查找
res3=driver.find_element_by_xpath('//a[contains(@href,"image5")]') 

(4)其它

# *代表所有标签 查找指定class值的所有标签,注意这里是elements,所以输出列表
driver.find_elements_by_xpath('//*[@class="xxxxx"]')

# 这样连着写中括号,代表且的关系,查找所有div标签中class值为指定的两个值的标签 driver.find_elements_by_xpath('//div[@class="xxxxx"][@class="yyyyy"]')
# 查找所有的a标签,条件是a标签中的img标签的src属性值为指定内容,注意这里是element,所以只返回一个selenium对象 print(driver.find_element_by_xpath('//a[img/@src="image2_thumb.jpg"]').text)
# 查找所有a标签的父元素中的第一个,因为这里是element,第一个点代表a标签这一级,第二个点表示上一级元素 print(driver.find_element_by_xpath('//a/..').tag_name)
# 查找所有的img标签的父元素,这里是elements,所以返回列表 print(driver.find_elements_by_xpath('//img//..'))

 

8、css选择器:就直接写css选择器的语法就可以

tag=driver.find_elements_by_css_selector('div a')

 

 

》》》》》等待元素被加载完

注意:我们查找标签的基础是这个标签已经加载完毕,或者某个事件加载完后,若标签还没加载完我们就去查找这时就会出现问题,所以要用到显性等待WebDriverWait,当然直接用隐形等待也可以

wait=WebDriverWait(driver,3),括号中用By来查找标签,可以用id值,class值,标签名,css选择器CSS_SELECTOR等

(1)等待某个标签加载完后

login_for_user=wait.until(EC.presence_of_element_located((By.CLASS_NAME,'tang-pass-footerBarULogin')))

(2)等待某个标签点击事件加载完后

login_for_user=wait.until(EC.element_to_be_clickable((By.CLASS_NAME,'tang-pass-footerBarULogin')))

(3)等待所有标签加载完后

login_for_user = wait.until(EC.presence_of_all_elements_located)

返回的selenium对象

 

posted @ 2018-01-11 15:40  九二零  阅读(94)  评论(0编辑  收藏  举报