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对象