# 一、 Selenium 简介
# Selenium 是一个自动化测试工具,支持多种浏览器(如chrome、safari、firefox、一些安卓浏览器等),主要用来
解决JavaScript渲染的问题。
Selenium通过给浏览器发送各种指令,来驱动浏览器去做出各种动作(跳转、输入、点击、下拉等等的操作)。可以 完全模拟网页加载,若爬虫过程中Requests库和urilb库无法正常爬取内容时,可以用Selenium库进行模拟js渲染,从而
达到完整的爬取网页的效果。
#
# 二、 基本使用
#
#
# 三、 声明浏览器对象 (以Chrome浏览器为例)
#
#
# 四、 访问页面
创建一个Chrome浏览器对象,并用webdriver类中的get()方法使其访问网页
#
#
# 五、 查找元素(获取元素的引用)
# 1> 查找一个元素(三种方式)
# 1) 查找示例
#
# 2)查找一个元素的其它一些方法(方法不同,查找所需的参数也不同)
# 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_css_selector
# 3)查找一个元素的一个通用方法
#
# 2> 查找多个元素
# 1)示例
#
# 2)查找一些元素的其它一些方法(方法不同,查找所需的参数也不同)
# 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_css_selector
# 3)查找一些元素的一个通用方法
#
#
# 六、 元素交互操作
#
# 更多操作:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement
# 七、 交互动作
# 将动作附加到动作链中串行执行
#
# 更多操作:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.common.action_chains
#
# 八、 执行JavaScript
# eg: 实现进度条下拉(直接用api方法实现有一定困难),可以通过使用JavaScript来实现。
#
#
# 九、 获取元素信息
# 1> 获取属性
# eg: 获取知乎logo信息,并打印
#
# 2> 获取文本值
#
# 3> 获取ID、位置、标签名、大小
#
#
# 十、 Frame
# 在子frame中查找不到父frame中的元素,需要切换回父frame中进行查找
#
#
# 十一、 等待
# selenium 在爬取网页时可能会有一些Ajax请求之类的,而selenium不会管你是否完成了网页的加载,他只负责加载框架
# 若其他的一些请求、元素未加载,则进行操作就会报错,所以需要加入一些等待,来确保操作的正常进行。
# 1> 隐式等待
# 当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不# 到元素的异常, 换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0
# *一般不会用隐式等待,网页加载速度都很快,只有在网速比较慢时使用。
# 使用implicitly_wait()来进行等待操作,参数为需要等待的时间,默认为0
#
# 2> 显式等待(常用)
# 1)特点: 指定一个等待条件,再指定一个最长等待时间,他会在最长等待时间内判断这个条件是否成立,如果成立,立# 即返回,如果不成立,他会一直等待,直到等待到最长等待时间,如果还是不满足这个条件,他就会抛出异常
# 如果在时间 内满足条件就会返回。
# 2)一些常见的等待条件:
# * title_is 标题是某内容
* title_contains 标题包含某内容
* presence_of_element_located 元素加载出,传入定位元组,如(By.ID, 'p')
* visibility_of_element_located 元素可见,传入定位元组
* visibility_of 可见,传入元素对象
* presence_of_all_elements_located 所有元素加载出
* text_to_be_present_in_element 某个元素文本包含某文字
* text_to_be_present_in_element_value 某个元素值包含某文字
* frame_to_be_available_and_switch_to_it frame加载并切换
* invisibility_of_element_located 元素不可见
* element_to_be_clickable 元素可点击
* staleness_of 判断一个元素是否仍在DOM,可判断页面是否已经刷新
* element_to_be_selected 元素可选择,传元素对象
* element_located_to_be_selected 元素可选择,传入定位元组
* element_selection_state_to_be 传入元素对象以及状态,相等返回True,否则返回False
* element_located_selection_state_to_be 传入定位元组以及状态,相等返回True,否则返回False
* alert_is_present 是否出现Alert
# 详细内容:http://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.support.expected_conditions
# 3)示例:
#
#
# 十二、 浏览器的前进和后退(back()、forward())
#
#
# 十三、 Cookies
# 用于需要登录的一些网址时,可以保持登录状态之类的操作。
#
#
# 十四、 选项卡管理(标签页管理)
# 1> 通过执行一个JS来打开一个网页的选项卡(常用)
这里其实是先获取两个选项卡(标签页)代号,然后通过代号进行切换选项卡
#
#
# 这不知道为什么会报warning???????
# 2> 通过控制键盘输入来进行标签页管理(即利用浏览器进行标签页操作的快捷键进行操作)
#
# 十五、 异常处理(会有各种各样的异常,这里只是演示)
#
# 异常处理详细文档:http://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
#