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 <div class="btn-wrap"> could not be scrolled into view

2>selenium.common.exceptions.ElementClickInterceptedException: Message: Element <a class="app-btn btn-application" href="#this"> is not clickable at point (587,568.5) because another element <iframe id="dialogIframe" name="dialogIframe" src="https://passport.jd.com/uc/popupLogin2013?clstag1=0&clstag2=0&r=0.7116938510187444&t=1537428030552"> obscures it

3>Message: Browsing context has been discarded

我遇到以上问题的原因:

1>我缩放了运行代码自动加载的浏览器,代码运行之后导致查找元素的时候出现问题。

解决:启动时,浏览器是多大就直接使用,不进行缩放处理。

2>未及时进行窗口切换,需要在哪个界面进行操作,就要确保当前的窗口是这个界面。

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我知道了。针对你的问题,下面是三种设置元素等待的方法: 1. 强制等待:使用 time 模块的 sleep 函数,强制等待指定的时间,等待页面加载完毕,然后再进行后续操作。这种方法最简单,但是不够灵活,会浪费时间。 示例代码: ```python import time driver.get('http://www.example.com') time.sleep(5) # 等待5秒钟 ``` 2. 隐式等待:使用 driver.implicitly_wait() 方法,设置一个最长等待时间,在这个时间内如果页面加载完毕,就开始执行后续操作;如果超时还未加载完成,则抛出异常。 示例代码: ```python driver.implicitly_wait(10) # 设置最长等待时间为10秒钟 driver.get('http://www.example.com') # 加载页面 element = driver.find_element_by_xpath('//input[@name="username"]') # 查找元素 ``` 3. 显式等待:使用 WebDriverWait 类,指定一个最长等待时间,并根据指定的条件判断是否加载完毕,如果条件成立就开始执行后续操作;如果超时还未成立,则抛出异常。 示例代码: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By driver.get('http://www.example.com') # 加载页面 element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPATH, '//input[@name="username"]'))) # 等待元素加载完毕 ``` 这三种方法都可以等待页面加载完毕,只是使用方式略有不同。根据实际情况选择合适的方法即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值