网页自动化操作(1)--selenium库的常用方法介绍

1、无界面浏览器


from selenium import webdriver

# 无界面的浏览器
option = webdriver.ChromeOptions()
option.add_argument("headless")
browser = webdriver.Chrome(options=option)

# 访问百度首页
browser.get(r'https://www.baidu.com/')
# 截图预览
browser.get_screenshot_as_file('截图.png')

# 关闭浏览器
browser.close()


2、有界面浏览器

from selenium import webdriver
import time

browser = webdriver.Chrome()

# 设置浏览器大小:全屏
browser.maximize_window()
browser.get(r'https://www.baidu.com')
time.sleep(2)

# 设置分辨率 500*500
browser.set_window_size(500,500)
time.sleep(2)

# 设置分辨率 1000*800
browser.set_window_size(1000,800)
time.sleep(2)

# 关闭当前句柄标识的标签页
browser.close()

# 退出驱动(关闭浏览器)

browser.quit()

3、其他常用操作

#刷新页面
try:
# 刷新页面
browser.refresh()
print('刷新页面')
except Exception as e:
print('刷新失败')


#页面前进与后退
# 回退到前一个页面
browser.back()
time.sleep(2)

# 前进到下一个页面
browser.forward()
time.sleep(2)

# 发送文本
browser.send_keys()

# 点击
browser.click()

# 清除输入的文本
browser.clear()

# 回车确认
browser.submit()

4、页面基础属性获取

# 网页标题
print(browser.title)
# 当前网址
print(browser.current_url)
# 浏览器名称
print(browser.name)
# 网页源码
print(browser.page_source)
• 这里的页面源码我们就可以用正则表达式、Bs4、xpath以及pyquery等工具进行解析提取想要的信息;

5、定位方法:
class、id、name、xpath、css

link定位:
# 以百度输入框新闻链接为例,点击新闻 链接
browser.find_element_by_link_text('新闻').click()
time.sleep(2)

partial定位:
有时候一个超链接的文本很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。

# 点击新闻 链接
browser.find_element_by_partial_link_text('闻').click()
time.sleep(2)

多个元素定位:
如果定位的目标元素在网页中不止一个,那么则需要用到find_elements,得到的结果会是列表形式。简单来说,就是element后面多了复数标识s,其他操作一致。

6、获取页面元素属性

get_attribute获取属性:

logo = browser.find_element_by_class_name('index-logo-src')
print(logo)
# 打印logo的链接地址
print(logo.get_attribute('src'))

获取文本和链接:

browser.get(r'https://www.baidu.com')

logo = browser.find_element_by_css_selector('#hotsearch-content-wrapper > li:nth-child(1) > a')
print(logo.text)
print(logo.get_attribute('href'))

获取其他属性

# 也可以获取id、位置、标签名和大小等属性
browser.get(r'https://www.baidu.com')

logo = browser.find_element_by_class_name('index-logo-src')
print(logo.id)
print(logo.location)
print(logo.tag_name)
print(logo.size)

7、下拉框操作

# 需要使用到select类
from selenium.webdriver.support.select import Select

# 定位方法如下:

'''1、三种选择某一选项的方法'''

select_by_index() # 通过索引定位;注意:index索引是从“0”开始。
select_by_value() # 通过value值定位,value标签的属性值。
select_by_visible_text() # 通过文本值定位,即显示在下拉框的值。

'''2、三种返回options信息的方法'''

options # 返回select元素所有的options
all_selected_options # 返回select元素中所有已选中的选项
first_selected_options # 返回select元素中选中的第一个选项


'''3、四种取消选中项的方法'''

deselect_all # 取消全部的已选择项
deselect_by_index # 取消已选中的索引项
deselect_by_value # 取消已选中的value值
deselect_by_visible_text # 取消已选中的文本值

8、多窗口切换

获取当前的所有页面句柄(句柄可以认为是一个存储页面对象的标识位,通过这个标识位可以轻松识别、跳转到指定的标签页;)

self.driver = webdriver.Chrome()        # 凡后文使用self.driver的都承接此处对象的实例化

current_window = self.driver.current_window_handle      # 获取当前首标签页的句柄,在自动化逻辑中,打开url时第一个标签页就是这个“首标签页”,一定要通过专门的方法讲游标切换到其他标签页才可操作其他标签页;

all_windows = self.driver.window_handles           # 获取当前所有标签页的句柄,对象以有序(可以通过索引获取元)的对象存在

self.driver.switch_to_window(window_handles[-1])      # 切换到指定索引的标签页,此处指最后一个标签页

 

9、等待设置

在上面使用的都是sleep()方法,这个方法,存在的弊端是,无论界面是否需要或能够立即执行下一步,都需要等待指定的时间,才能进行下一步,这会导致等待多余的时间,造成时间浪费,或等待时间不够,导致需要进行下一步操作的元素没有加载出来,导致操作失败;个人觉得这个方法是使用最简单的,这里补充一下sleep()的优化使用:

结合while语句块,当网页的加载的内容未达到可操作的条件时,持续增加少量的等待时间,当条件满足时,则进入下一步操作;

如下,当点击成功,则跳出循环,否则增加0.2秒的等待,继续循环尝试点击,如此往复直到点击成功:

while True:

  try:

    self.driver.find_element(By.XPTH, 'Xpath of element').click()

    break

  except:

    sleep(0.2)

    continue

使用seleniu自带的时间等待方法:

self.driver.implicitly_wait(10.0)    # 在此方法中,最多等待10秒,如果提前达到可操作条件,则提前结束等待,和上文的sleep()结合while循环使用的现象感觉是差不多的,但是实际使用时会经常出现页面命名没有加载完,但是提前结束了等待,导致后续的操作出现元素不存在的报错,这是由于一个完整的网页由很多资源组成,implicitly_wait()方法判断的参照物和网页实际的组成不一致,导致前面的现场出现;如遇到这个问题可考虑使用上面的方法;

 

posted @ 2023-06-15 17:51  段愿仁长九  阅读(90)  评论(0)    收藏  举报