selenium
Selenium
-
什么是selenium?
-
安装
pip install selenium -
基本使用
- 实例化Chrome Webdriver
from selenium import webdriver browser = webdriver.Chrome()
- browser.get()方法将打开URL中填写的地址,WebDriver 将等待, 直到页面完全加载完毕(其实是等到”onload” 方法执行完毕),然后返回继续执行你的脚本。但是如果页面使用了大量的Ajax加载, WebDriver可能不知道页面什么时候加载完成。
url = 'https://www.baidu.com' browser.get(url)
-
选择页面元素,提供了如下方式
- 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
-
-
除上述查找元素的方法外,还有两个私有方法find_element和find_elements
from selenium.webdriver.common.by import By # By的可用属性分别为:ID、XPATH、LINK_TEXT、PARTIAL_TEXT、NAME、CLASS_NAME、CSS_SELECTOR driver.find_element(By.XPATH, '//button[text()="Some text"]') driver.find_elements(By.XPATH, '//button')
- 显式等待
因为现在很多页面中都大量使用了Ajax,会造成页面中不同的元素加载完成的时间不同,就使得查找页面元素有时会不成功,为了解决这种问题,可以使用waits。waits提供了一些操作之间的时间间隔---主要是定位元素或针对该元素的任何其他操作。
显式等待会让WebDriver等待满足一定的条件以后再进一步的执行。
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Firefox() driver.get("http://somedomain/url_that_delays_loading") try: element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "myDynamicElement")) ) finally: driver.quit()
expected_conditions 模块提供了一组预定义的条件供WebDriverWait使用。
from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) element = wait.until(EC.element_to_be_clickable((By.ID,'someid')))
- 隐式等待
让Webdriver等待一定的时间后再才是查找某元素。
from selenium import webdriver driver = webdriver.Firefox() driver.implicitly_wait(10) # seconds driver.get("http://somedomain/url_that_delays_loading") myDynamicElement = driver.find_element_by_id("myDynamicElement")
- 向input框中输入值
browser.find_element_by_id('kw').send_keys('Python')
- 提交
browser.find_element_by_id('submit')
- 其他常用操作
page_source # 页面源码 execute_script('js') # 执行js代码 fullscreen_window() # 浏览器全屏 get_screenshot_as_base64() # 截屏保存为base64格式 get_screenshot_as_file(filename) # 截屏保存为文件 get_screenshot_as_png() # 截屏保存为png save_screenshot(filename) # 同上 quit() # 关闭浏览器 close() # 关闭当前Tab页面 refresh() # 刷新页面 switch_to_frame(frame_reference) # 切换到另一个frame 更多请查看:https://selenium-python-zh.readthedocs.io/en/latest/api.html
-
Chrome无头模式设置
from selenium.webdriver.chrome.options import Options
# 创建一个参数对象,用来控制chrome以界面模式打开
chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
browser = webdriver.Chrome(executable_path=path,chrome_options=chrome_options)
- 为什么selenium不能被用于线上项目?(除非可以检测使用的浏览器版本)
无法预知用户端使用的是什么浏览器,如果用户使用的浏览器和我们代码都得Webdriver版本不对应,可能出现无法正常工作的现象,所以一般上线不使用selenium。 - 虚假UserAgent
from fake_useragent import UserAgent
ua = UserAgent(verify_ssl=False, use_cache_server=False).random