使用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() 是切换窗口的方法
# 关闭当前窗口
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()
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):
1>Message: Element
2>selenium.common.exceptions.ElementClickInterceptedException: Message: Element is not clickable at point (587,568.5) because another element
3>Message: Browsing context has been discarded
我遇到以上问题的原因:
1>我缩放了运行代码自动加载的浏览器,代码运行之后导致查找元素的时候出现问题。
解决:启动时,浏览器是多大就直接使用,不进行缩放处理。
2>未及时进行窗口切换,需要在哪个界面进行操作,就要确保当前的窗口是这个界面。