XZ_Python之使用selenium加载动态网页和判断元素是否存在

1、动态网页加载获取最新的窗口

使用Python加载动态网页,即,当加载网页时,打开网页的方式是"__blank",跳转到了另一个网页,如下图:

点击了12306首页的“购票”按钮,就新打开了第2个页面,这时候,如果想在第二个页面进行操作,就需要将当前句柄转到最新的页面:

wd.switch_to.window(wd.window_handles[len(wd.window_handles)-1])

其中,wd是实例化的webdriver全局参数:

wd = webdriver.Firefox() 

window_handles是一个数组,里面包含当前操作的所有窗口;

switch_to.window() 是切换窗口的方法

2、selenium的常用方法

# 关闭当前窗口
wd.close()
# 关闭/退出浏览器
wd.quit()
# 获取当前窗口
current_window = wd.current_window_handle
# 浏览器最大化
wd.maximize_window()
# 浏览器最小化
wd.minimize_window()
# 设置浏览器size
wd.set_window_size(200, 400)
# 定位一个对象
wd.find_element_by_id('loginname')  # id
wd.find_element_by_xpath("//span[contains(@id, 'pager')]/a")  # xpath
wd.find_element_by_link_text()  # link_text
wd.find_element_by_partial_link_text() # partial_link_text
wd.find_element_by_name()  # name
wd.find_element_by_tag_name()  # tag_name
wd.find_element_by_class_name()  # class_name
wd.find_element_by_css_selector()  # css_selector

# 定位多个对象,返回元组
wd.find_elements_by_id('loginname')  #查找同一 id的多个元素
wd.find_elements_by_xpath("//span[contains(@id, 'pager')]/a")  # xpath
wd.find_elements_by_link_text()  # link_text
wd.find_elements_by_partial_link_text() # partial_link_text
wd.find_elements_by_name()  # name
wd.find_elements_by_tag_name()  # tag_name
wd.find_elements_by_class_name()  # class_name
wd.find_elements_by_css_selector()  # css_selector
# 操作 element 对象
# 点击
wd.find_element_by_class_name('ui-pager-next').click()
# 清除内容
wd.find_element_by_class_name('ui-pager-next').clear()
# 填充/输入
wd.find_element_by_id('loginname').send_keys(user_name)
# 提交表单
wd.find_element_by_class_name('link-login').submit()

# 获取元素尺寸
wd.find_element_by_class_name('ui-pager-next').size
# 获取元素文本
wd.find_element_by_class_name('ui-pager-next').text
# 获取元素的属性值
wd.find_element_by_class_name('ui-pager-next').get_property('text_length')
# 是否可见
wd.find_element_by_class_name('msg-er43ror').is_displayed()
# 是否可用
wd.find_element_by_class_name('JDJRV-smallimg').is_enabled()
# 是否被选中
wd.find_element_by_class_name('JDJRV-smallimg').is_selected()

3、判断元素是否存在

Python没有直接的判断元素是否存在的方法,我们可以使用下列的方式判断,在使用的时候只需要切换查找元素的方法即可:

# 判断元素是否存在
def is_element_exist(name, by_class):
    if by_class:
        try:  # 通过class_name查找元素
            wd.find_element_by_class_name(name)
            return True
        except NoSuchElementException:
            return False
    else:
        try:  # 通过xpath查找元素
            wd.find_element_by_xpath(name)
            return True
        except NoSuchElementException:
            return False

调用方式:

# 如果使用class_name查找时,判断是否存在:
if is_element_exist('msg-error', True):

# 如果使用xpath查找时,判断是否存在:
if is_element_exist('msg-error', False):

4、遇到以下问题的解决:

1>Message: Element

could not be scrolled into view

2>selenium.common.exceptions.ElementClickInterceptedException: Message: Element is not clickable at point (587,568.5) because another element