Chrome启动选项

这是一个Chrome的参数对象,在此对象中使用add_argument()方法可以添加启动参数,添加完毕后可以在初始化Webdriver对象时将此Options对象传入,则可以实现以特定参数启动Chrome。

例子:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# 打开一个Chrome浏览器
options = Options()
options.add_argument('--window-size=1000,700')
options.add_argument('--disable-infobars')
browser = webdriver.Chrome(chrome_options = options)
# 请求百度首页
browser.get('https://www.baidu.com')
time.sleep(5)
browser.quit()
  • 常用的启动参数

启动参数

作用

--user-agent=""

设置请求头的User-Agent

--window-size=1366,768

设置浏览器分辨率

--headless

无界面运行

--start-maximized

最大化运行

--incognito

隐身模式

--disable-javascript

禁用javascript

--disable-infobars

禁用浏览器正在被自动化程序控制的提示

启动参数有很多,可自行相关查阅

  • 禁用图片加载

Chrome的禁用图片加载参数设置比较复杂,如下所示:

prefs = {
    'profile.default_content_setting_values' : {
        'images' : 2
    }
}
options.add_experimental_option('prefs',prefs)
  • 禁用浏览器弹窗

使用浏览器时常常会有弹窗弹出,以下选项可以禁止弹窗:

prefs = {  
    'profile.default_content_setting_values' :  {  
        'notifications' : 2  
     }  
}  
options.add_experimental_option('prefs',prefs)

 Chrome WebDriver对象

再将selenium安装时,我讲到应将解压后的webdriver放在系统环境变量中,其实不然。我们也可以将其放在执行项目下。再实例化时传入指定参数即可。

from selenium import webdriver
browser = webdriver.Chrome(executable_path='chromedriver.exe')

 

Remote Webdriver

selenium.webdriver.remote.webdriver.WebDriver 这个类其实是所有其他Webdriver的父类,例如Chrome Webdriver,Firefox Webdriver都是继承自这个类。这个类中实现了每个Webdriver间相通的方法。

方法

  • get(url):在当前浏览器会话中访问传入的url地址。
driver.get('https://www.baidu.com')
  • close():关闭浏览器当前窗口。
  • quit():退出webdriver并关闭所有窗口。
  • refresh():刷新当前页面。

属性

  • title:获取当前页的标题。
  • page_source:获取当前页渲染后的源代码。
  • current_url:获取当前页面的url。
  • window_handles:获取当前会话中所有窗口的句柄,返回的是一个列表。

例子

实现打开百度首页,并自动刷新一次,打印当前的url,title及窗口句柄,并在5秒后自动关闭浏览器。

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time

# 打开一个Chrome浏览器
options = Options()
options.add_argument('--disable-infobars')
browser = webdriver.Chrome(chrome_options = options)
# 请求百度首页
browser.get('https://www.baidu.com')
print(browser.title)
print(browser.current_url)
print(browser.window_handles)
browser.refresh()
time.sleep(5)
browser.quit()
百度一下,你就知道
https://www.baidu.com/
['CDwindow-FFC72CF60AA9472A231507D01435F5B8', 'CDwindow-521B7A7026F5519D4EBDF0CC717BBB0C']

查找元素

Webdriver对象中内置了查找节点元素的方法,使用非常方便。查找后返回的是一个Webelement对象。

单个查找

方法

作用

find_element_by_xpath()

通过Xpath查找

find_element_by_class_name()

通过class属性查找

find_element_by_css_selector()

通过css选择器查找

find_element_by_id()

通过id查找

find_element_by_link_text()

通过链接文本查找

find_element_by_name()

通过name属性进行查找

find_element_by_partial_link_text()

通过链接文本的部分匹配查找

find_element_by_tag_name()

通过标签名查找

多个查找

上面的方法都是将第一个找到的元素进行返回,而将所有匹配的元素进行返回使用的是find_elements_by_*方法。各种方法参照上表格。此方法返回的是一个Webelement对象组成的列表。

私有方法查找

除了以上的多种查找方式,还有两种私有方法find_element()和find_elements()可以使用:

from  import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

By这个类是专门用来查找元素时传入的参数,这个类中有以下属性:

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

操作Cookie

  • add_cookie(cookie_dict)

给当前会话添加一个cookie。cookie_dict: 一个字典对象,必须要有"name"和"value"两个键,可选的键有:“path”, “domain”, “secure”, “expiry” 。

driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’})
driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})
  • get_cookie(name)

按name获取单个Cookie,没有则返回None。

  • get_cookies()

获取所有Cookie,返回的是一组字典。

  • delete_all_cookies()

删除所有Cookies。

  • delete_cookie(name)

按name删除指定cookie。

获取截屏

  • get_screenshot_as_base64()

获取当前窗口的截图保存为一个base64编码的字符串。

  • get_screenshot_as_file(filename)

获取当前窗口的截图保存为一个png格式的图片,filename参数为图片的保存地址,最后应该以.png结尾。如果出现IO错误,则返回False。

  • get_screenshot_as_png()

获取当前窗口的截图保存为一个png格式的二进制字符串。

获取窗口信息

  • get_window_position(windowHandle='current')

获取当前窗口的x,y坐标。

  • get_window_rect()

获取当前窗口的x,y坐标和当前窗口的高度和宽度。

In [1]: driver.get_window_rect()
Out[1]: {'height': 600, 'width': 800, 'x': 0, 'y': 200}
  • get_window_size(windowHandle='current')

获取当前窗口的高度和宽度。

切换框架或窗口

  • switch_to.frame(frame_reference)

在页面中,如果有iframe这样的页面子框架的话,selenium是无法搜索到子框架frame中的元素,并与之定位的。所以如果要操作frame中的元素,则首先要切换到这个frame中。

首先我们需要使用上面提供的搜索方法find_element_by_*等来找到frame框架,然后传入到切换的方法中。

frame = driver.find_element_by_tag_name("iframe")
driver.switch_to.frame(frame)

还有一个方法可以切换回主界面:

driver.switch_to.default_content()
  • switch_to.window(window_name)

这个方法可以让我们在一个浏览器中的窗口中互相切换,这个方法中需要传入目标窗口的句柄,窗口句柄可以通过driver.window_handles等方法来进行获取。

windows = driver.window_handles
# 切换到最新打开的窗口中
switch_to.window(windows[-1])

执行JS代码

  • execute_async_script(script, *args)

在当前的window/frame中异步执行JS代码。script表示要执行的JS代码,*args表示JS代码执行要传入的参数。

  • execute_script(script, *args)

在当前的window/frame中同步执行JS代码。