笔记-爬虫-selenium常用方法

笔记-爬虫-selenium常用方法

1.      查找元素

常用的查找方法

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_class_name

find_element_by_css_selector

也可以使用通用的方法

from selenium import webdriver

from selenium.webdriver.common.by import By

browser = webdriver.Chrome()

browser.get('https://www.taobao.com')

input_first = browser.find_element(BY.ID,'q')#第一个参数传入名称,第二个传入具体的参数

print(input_first)

browser.close()

查找多个元素,elements多个s

input_first = browser.find_elements_by_id('q')

2.      交互操作

2.1.    操作浏览器

方法

说明

set_window_size()

设置浏览器的大小

back()

控制浏览器后退

forward()

控制浏览器前进

refresh()

刷新当前页面

submit()

用于提交表单

close()

关闭单个窗口

quit()

关闭所有窗口

get_screenshot_as_file(self, filename)

用于截取当前窗口,并把图片保存到本地

driver.switchTo().window("windowName")

在Windows之间移动

driver.switchTo().frame("frameName");

在 frame 之间移动

注:frame相当于独立的网页,如果在父类网frame查找子类的,则必须切换到子类的frame,子类如果查找父类也需要先切换

from selenium import webdriver

from selenium.common.exceptions import NoSuchElementException

browser = webdriver.Chrome()

url = 'http://www.runoob.com/try/try.php?filename=jqueryui-api-droppable'

browser.get(url)

browser.switch_to.frame('iframeResult')

source = browser.find_element_by_css_selector('#draggable')

print(source)

try:

    logo = browser.find_element_by_class_name('logo')

except NoSuchElementException:

    print('NO LOGO')

browser.switch_to.parent_frame()

logo = browser.find_element_by_class_name('logo')

print(logo)

print(logo.text)

2.2.    元素操作

clear()

清除文本

send_keys(*value)

模拟按键输入/赋值

click()

单击元素

current_url

获取当前页面url

location

元素坐标

get_attribute(element_name)

获取元素属性值

is_selected()

size

元素大小

is_displayed()

is_enabled()

text

元素文本值

tagName

元素的tagName

2.3.    鼠标操作

这个需要使用webdriver下的ActionChains类,这个类是操作鼠标操作的:

from selenium.webdriver import ActionChains

鼠标操作可分为三类:鼠标移动、鼠标拖拽、鼠标点击

element = driver.find_element_by_name('tj_settingicon')

#鼠标点击

ActionChains(driver).click(element).perform() #单击某元素

ActionChains(driver).click_and_hold(element).perform() #在此元素上按下左键不放

ActionChains(driver).context_click(element).perform() #在此元素上单击右键

ActionChains(driver).double_click(element).perform() #在此元素上双击

#鼠标拖拽

ActionChains(driver).drag_and_drop(source,target).perform() #从一个元素的位置,拖至另一个元素位置松开

ActionChains(driver).drag_and_drop_by_offset(source,xoffset,yoffset) #以坐标的形式拖拽,x,y

#鼠标移动

ActionChains(driver).move_by_offset(x,y) #移动到(x,y)坐标位置

ActionChains(driver).move_to_element(element) #鼠标移动到某个元素上

ActionChains(driver).move_to_element_with_offset(element,x,y) #移动到某个元素上,然后,在移动到相对坐标(x,y)上

2.4.    执行JavaScript

有些动作可能没有提供api,比如进度条下拉,这时,我们可以通过代码执行JavaScript。

webdriver 提供了 execute_script() 接口用来调用 js 代码。

执行 JS 一般有两种场景:

1:一种是在页面上直接执行 JS

2:另一种是在某个已经定位的元素上执行 JS

from selenium import webdriver

browser = webdriver.Chrome()

browser.get('https://www.zhihu.com/explore')

browser.execute_script('window.scrollTo(0, document.body.scrollHeight)')

browser.execute_script('alert("To Bottom")')

2.5.    等待

隐式等待

当使用了隐式等待执行测试的时候,如果 WebDriver没有在 DOM中找到元素,将继续等待,超出设定时间后则抛出找不到元素的异常,

换句话说,当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找 DOM,默认的时间是0

browser.implicitly_wait(10)#等待十秒加载不出来就会抛出异常,10秒内加载出来正常返回

browser.get('https://www.zhihu.com/explore')

input = browser.find_element_by_class_name('zu-top-add-question')

显式等待

指定一个等待条件,和一个最长等待时间,程序会判断在等待时间内条件是否满足,如果满足则返回,如果不满足会继续等待,超过时间就会抛出异常

from selenium import webdriver

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC

browser = webdriver.Chrome()

browser.get('https://www.taobao.com/')

wait = WebDriverWait(browser, 10)

input = wait.until(EC.presence_of_element_located((By.ID, 'q')))

button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, '.btn-search')))

print(input, button)

until()

WebDriverWait()一般由until()(或until_not())方法配合使用,下面是until()和until_not()方法的说明。

until(method, message=’ ’)

调用该方法提供的驱动程序作为一个参数,直到返回值为Ture。

until_not(method, message=’ ’)

调用该方法提供的驱动程序作为一个参数,直到返回值为False。

Expected Conditions

在本例中,我们在使用expected_conditions 类时对其时行了重命名,通过as 关键字对其重命名为EC,

并调用presence_of_element_located()判断元素是否存在。

expected_conditions 类提供一些预期条件的实现。

title_is 用于判断标题是否xx。

title_contains 用于判断标题是否包含xx 信息。

presence_of_element_located 元素是否存在。

visibility_of_element_located 元素是否可见。

visibility_of 是否可见

presence_of_all_elements_located 判断一组元素的是否存在

text_to_be_present_in_element 判断元素是否有xx 文本信息

text_to_be_present_in_element_value 判断元素值是否有xx 文本信息

frame_to_be_available_and_switch_to_it 表单是否可用,并切换到该表单。

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 一个期望检查如果给定的元素被选中。

element_located_selection_state_to_be 期望找到一个元素并检查是否选择状态

alert_is_present 预期一个警告信息

除了expected_conditions 所提供的预期方法,我们也可以使用前面学过的is_displayed()方法来判断元素是否可。

2.6.    Cookies

driver.get_cookies()

driver.get_cookies()

delete_all_cookies()

delete_cookie(name)

add_cookie(cookie_dict)

添加 cookie,必须有 name 和 value 值

2.7.    异常处理

from selenium import webdriver

from selenium.common.exceptions import TimeoutException, NoSuchElementException

browser = webdriver.Chrome()

try:

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

except TimeoutException:

    print('Time Out')

try:

    browser.find_element_by_id('hello')

except NoSuchElementException:

    print('No Element')

finally:

browser.close()

猜你喜欢

转载自www.cnblogs.com/wodeboke-y/p/10054634.html