from selenium import webdriver
# Chrome游览器
driver = webdriver.Chrome()
# Firefox游览器
# driver = webdriver.Firefox()
# IE游览器
# driver=webdriver.ie()
driver.get("https://service.scrc168.com/ddcx/")
Headless Chrome 是 Chrome 浏览器的无界面形态,可以在不打开浏览器的前提下,使用所有 Chrome 支持的特性运行程序。
附:mac和linux环境要求chrome版本是59+,而windows版本的chrome要求是60+,同时chromedriver要求2.30+版本。
from selenium import webdriver
chrome_options = webdriver.ChromeOptions()
# 使用headless无界面浏览器模式
chrome_options.add_argument('--headless') #增加无界面选项
chrome_options.add_argument('--disable-gpu') #如果不加这个选项,有时定位会出现问题
# 启动浏览器,获取网页源代码
browser = webdriver.Chrome(options=chrome_options)
browser.get("https://www.taobao.com/")
browser.quit()
Selenium操作浏览器是不加载任何配置的
加载Chrome配置:
在Chrome游览器地址栏输入chrome://version/,查看自己的“个人资料路径”,然后在浏览器启动时,调用这个配置文件,具体代码如下:
from selenium import webdriver
option = webdriver.ChromeOptions()
option.add_argument('--user-data-dir=/home/xou/.config/google-chrome/Default')
driver=webdriver.Chrome(chrome_options=option)
加载Firefox配置
打开Firefox点右上角设置>?(帮助)>故障排除信息>显示文件夹,复制使用配置文件路径,具体代码如下:
from selenium import webdriver
# 加载配置
profile = webdriver.FirefoxProfile(r"/home/xou/.mozilla/firefox/fswv9oaw.default")
# 启动浏览器配置
driver = webdriver.Firefox(profile)
定位一个元素 | 定位多个元素 | 含义 |
---|---|---|
find_element_by_id | find_elements_by_id | 通过元素id定位 |
find_element_by_name | find_elements_by_name | 通过元素name定位 |
find_element_by_xpath | find_elements_by_xpath | 通过xpath表达式定位 |
find_element_by_link_text | find_elements_by_link_tex | 通过完整超链接定位 |
find_element_by_partial_link_text | find_elements_by_partial_link_text | 通过部分链接定位 |
find_element_by_tag_name | find_elements_by_tag_name | 通过标签定位 |
find_element_by_class_name | find_elements_by_class_name | 通过类名进行定位 |
find_elements_by_css_selector | find_elements_by_css_selector | 通过css选择器进行定位 |
实操问题
通过.is_displayed()
判断元素是否被隐藏(返回False,则表示元素被隐藏),若被隐藏,解决方法如下:
textContent
、innerText
、innerHTML
等属性获取。innerHTML
会返回元素内部的HTML,包含所有的HTML标签。textContent
和innerText
只会得到文本内容,而不会包含HTML标签。textContent
是W3C兼容的文字内容属性,但是IE不支持;innerText
不是W3C DOM的指定内容,但是FireFox不支持。注:还有一种情况,程序跳转页面后获取元素标签文本操作在游览器加载页面之前,从而导致获取元素标签文本为空,可设置一段等待时间。
outerHTML——获取单个元素具体的HTML源文件
当class name是有多个class组合的复合类(中间以空格隔开),如果直接进行定位会出现报错,解决方法如下:
time.sleep()
implicitly_wait(5)
等待时间内只要找到了元素就开始执行,5秒钟后未找到,就超时抛出找不到元素的异常
注: 一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,它将会在寻找每个元素的时候都进行等待
selenium.webdriver.support.wait.WebDriverWait,配合该类的until()和until_not()方法,就能够根据判断条件而进行灵活地等待了。它主要的意思
就是:程序每隔xx秒看一眼,如果条件成立了,则执行下一步,否则继续等待,直到超过设置的最长时间,然后抛出TimeoutException。
class WebDriverWait(object):
def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)
"""
- driver :WebDriver的实例(Ie, Firefox, Chrome or Remote)
- timeout :超时之前的秒数
- poll_frequency :两次呼叫之间的睡眠间隔默认情况下为0.5秒。
- ignored_exceptions :调用期间忽略的异常类的可迭代结构。默认情况下,它仅包含NoSuchElementException。
"""
def until(self, method, message='')
"""
-method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False
-message: 如果超时,抛出TimeoutException,将message传入异常
"""
def until_not(self, method, message='')
"""
与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行
"""
until或until_not中的可执行方法method参数,传入对象一定是有call()方法的。可以用selenium提供的 expected_conditions
模块中的各种条件,
也可以用WebElement的 is_displayed()
、is_enabled()
、is_selected()
方法,或者用自己封装的方法
expected_conditions 一般也简称为EC
判断方法:
title_is:判断当前页面的title是否完全等于(==)预期字符串,返回是布尔值
title_contains 判断当前页面的title是否包含预期字符串,返回布尔值
presence_of_element_located:判断某个元素是否被加到了dom树里,并不代表该元素一定可见
visibility_of_element_located : 判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
visibility_of :跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
presence_of_all_elements_located : 判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
text_to_be_present_in_element : 判断某个元素中的text是否 包含 了预期的字符串
text_to_be_present_in_element_value:判断某个元素中的value属性是否 包含 了预期的字符串
frame_to_be_available_and_switch_to_it : 判断该frame是否可以switch进去,如果可以的话,返回True并且switch进去,否则返回False
invisibility_of_element_located : 判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable : 判断某个元素中是否可见并且是enable的,这样的话才叫clickable
staleness_of :等某个元素从dom树中移除,注意,这个方法也是返回True或False
element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be:判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
alert_is_present : 判断页面上是否存在alert
将浏览器最大化显示
browser.maximize_window()
将浏览器最小化显示
browser.minimize_window()
设置浏览器宽480、高800显示
browser.set_window_size(480, 800)
前进
browser.forword()
后退
browser.back()
未完待续。。。。。。(今天被喜欢的人嫌弃了,后面的部分等两天再写吧)