selenium--安装--知识点--base--元素等待

安装


1. 火狐浏览器: 下载geckodriver.exe把这个文件放在和python.exe相同的路径下


geckodriver.exe: selenium用来打开火狐浏览器的驱动。需要将它和python.exe放在一起

2. 下载的位置:
https://github.com/mozilla/geckodriver/releases最新版火狐浏览器驱动geckodriver的地址。




知识点:

seleniumbase



 selenium测试框架在爬虫中的应用:


# 网页中通过js渲染的数据,爬虫的解决办法:
# 1. 去静态源码中查找<script>var infolist = {'name':'123', }</script>
# 2. 抓包或者网络请求中,查看是否有类似与jsonget请求,直接请求这个jsonAPI拿到数据
# 3. 使用phantomjs/selenium进行访问动态页面,而静态页面仍然使用requests进行获取


# selenium框架本身提供了许多元素定位的方法,find_element_by_id()这些方法底层是用python语言实现的,提取速度上会慢一些。通常情况下,使用phantomjs/selenium也只是获取js渲染后的网页源代码,而网页中数据的提取,还可以使用xpath, css, re, bs4, etree等。


# selenium框架的元素定位
# geckodriver.exe: selenium用来打开火狐浏览器的驱动。需要将它和python.exe放在一起。
# chromedriver.exe: 是谷歌的

# 注意:不兼容会出现启动错误
# 1. geckodriver.exe的版本必须和火狐浏览器的版本兼容;
# 2. geckodriver.exe的版本必须和当前操作系统兼容;

import time
from selenium import webdriver
from selenium.webdriver.common.by import By

# 创建一个浏览器对象,会打开一个浏览器窗口
driver = webdriver.Firefox()
# driver = webdriver.Chrome()

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

kw = driver.find_element(by=By.CSS_SELECTOR, value="#kw")
kw.send_keys('selenium')


# 通过id定位到输入框
# keyword = driver.find_element_by_id('kw')
# # <class 'selenium.webdriver.firefox.webelement.FirefoxWebElement'>
# print(type(keyword))
#
# # 在向输入框中输入内容之前,可以先将之前的旧内容清空
# keyword.clear()
#
# # 向输入框中输入内容send_keys
# keyword.send_keys('selenium')
#
# # 通过class定位到搜索按钮
# search_btn = driver.find_element_by_class_name('s_btn')
#
# # 点击search_btn
# search_btn.click()
#
# time.sleep(3)
#
# driver.find_element_by_css_selector('.result > h3 > a').click()

# 通过一个连接标签的文本内容定位标签
# driver.find_element_by_link_text('贴吧')

# driver.find_element_by_xpath('')

# 批量获取元素
# res = driver.find_elements_by_css_selector('.result')
# res = driver.find_elements(by=By.CSS_SELECTOR, value='.result')


# 获取js渲染后的网页源代码
print(driver.page_source)


time.sleep(3)
# 休眠2秒,将浏览器driver对象退出
driver.close()

 

selenium元素等待



# 元素等待:js代码执行渲染期间,导致数据/标签加载缓慢,如果元素没有加载完成,
直接通过find_element去进行定位,会出现元素不存在的异常。

# 1. time.sleep(10) 强制性等待,不管元素在设置时间范围内是否加载出来,
都必须要等待固定的时间。
# 2. WebDriverWait(10) 智能等待的方法,最多等待10秒,10秒之后仍然没有元素,
会抛出异常。10秒内找到这个元素,直接向下执行代码。
这个方法一般适用于单个元素的等待;
# 3. implicitly_wait(10) 最大等待时间10秒,针对的是整个页面,给当前页面设置
最大等待时间;

from selenium import webdriver
from selenium.webdriver.support.wait import WebDriverWait

driver = webdriver.Firefox()
driver.get('https://s.taobao.com/search?initiative_id=tbindexz_20170306&ie=utf8&spm=a21bo.2017.201856-taobao-item.2&sourceId=tb.index&search_type=item&ssid=s5-e&commend=all&imgfile=&q=%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91&suggest=history_1&_input_charset=utf-8&wq=&suggest_query=&source=suggest')


driver.implicitly_wait(20)


# 在定位价格时,添加元素等待
# price = WebDriverWait(driver, 20).until(lambda driver:driver.find_element_by_css_selector('.price > strong'))
# print(price.text)

# 方式二:
price = driver.find_element_by_css_selector('.ctx-box > .title > a')
is_display = WebDriverWait(driver, 20).until(lambda driver: price.is_displayed())

print(is_display)
if is_display:
    # 如果元素可见,再执行点击,输入,清空等操作
    price.click()
else:
    # 不可见
    pass

driver.close()

 

selenium查找元素的方法总结:

一次查找多个元素

partial: 局部的   [ ˈpɑ:rʃl ]

find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector

一次查找多个元素 (这些方法会返回一个list列表)

find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector



猜你喜欢

转载自blog.csdn.net/weixin_42312791/article/details/80744174
今日推荐