selenium入门学习笔记

1 元素定位及浏览器基本操作

1.1 游览器启动

1.1.1 普通方式启动

from selenium import webdriver

# Chrome游览器
driver = webdriver.Chrome()
# Firefox游览器
# driver = webdriver.Firefox()
# IE游览器 
# driver=webdriver.ie()
driver.get("https://service.scrc168.com/ddcx/")

1.1.2 Headless方式启动

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()

1.1.3 加载配置启动

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)

2 元素定位

定位一个元素 定位多个元素 含义
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选择器进行定位

实操问题

2.1 获取元素标签文本为空

通过.is_displayed()判断元素是否被隐藏(返回False,则表示元素被隐藏),若被隐藏,解决方法如下:

  • 修改当前定位元素方式方法(修改定位元素方式,或者修改定位元素的路径等)。由于webdriver spec的定义,selenium WebDriver只会与可见元素交互,所以获取隐藏元素的文本信息返回为空字符串。
  • 通过get_attribute()方法获取元素的文本信息。在获取隐藏元素的文本信息时,可以使用get_attribute()方法,通过textContentinnerTextinnerHTML等属性获取。innerHTML会返回元素内部的HTML,包含所有的HTML标签。textContentinnerText只会得到文本内容,而不会包含HTML标签。textContent是W3C兼容的文字内容属性,但是IE不支持;innerText不是W3C DOM的指定内容,但是FireFox不支持。

注:还有一种情况,程序跳转页面后获取元素标签文本操作在游览器加载页面之前,从而导致获取元素标签文本为空,可设置一段等待时间。
outerHTML——获取单个元素具体的HTML源文件

2.2 class含有空格

当class name是有多个class组合的复合类(中间以空格隔开),如果直接进行定位会出现报错,解决方法如下:

  • class属性唯一但是有空格,选择空格两边唯一的那一个
  • 若空格隔开的class不唯一可以通过索引进行定位
  • 通过css方法进行定位(空格以‘.’代替)

2.3 等待方式

2.3.1 强制等待

time.sleep()

2.3.2 隐性等待

implicitly_wait(5)
等待时间内只要找到了元素就开始执行,5秒钟后未找到,就超时抛出找不到元素的异常

注: 一旦设置了隐式等待,则它存在整个 WebDriver 对象实例的声明周期中,它将会在寻找每个元素的时候都进行等待

2.3.3 显性等待

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

2.4 游览器操作

2.4.1 浏览器最大化、最小化

将浏览器最大化显示
browser.maximize_window()

将浏览器最小化显示
browser.minimize_window()

2.4.2 浏览器设置窗口大小

设置浏览器宽480、高800显示
browser.set_window_size(480, 800)

2.4.3 浏览器前进后退

前进
browser.forword()

后退
browser.back()

未完待续。。。。。。(今天被喜欢的人嫌弃了,后面的部分等两天再写吧)

你可能感兴趣的:(Python,selenium)