Python的Selenium库使用过程中的常见问题汇总

点击隐藏菜单:

selenium包中ActionChains类给出的示例如下:

menu = driver.find_element_by_css_selector(".nav")
hidden_submenu = driver.find_element_by_css_selector(".nav #submenu1")

actions = ActionChains(driver)
actions.move_to_element(menu)
actions.click(hidden_submenu)
actions.perform()

这段代码的整体思路就是:

  • 先分别找到一级菜单元素和二级菜单元素
  • 新建动作链ActionChains
  • 将鼠标移动到一级菜单,这时会出发鼠标经过事件,显示隐藏的二级菜单
  • 点击二级菜单
  • 执行动作链
  • 如果直接使用elem.click()方法点击不可见元素会报元素不可见的错误:element not visible

    点击弹出层:

    1. Alert(警告信息)

    Alert弹出框,目的就是显示通知信息,只需用户看完信息后,点击OK(确定)就可以了。
    Selenium提供如下方法进行操作:

    # 点击OK(确定)按钮
    driver.switch_to.alert.accept()
    
    # 获取弹出框的信息内容
    driver.switch_to.alert.text
    

    注意:如果我们不去点击它,页面的其它元素是不能操作的。

    2. Confirm(确认信息)

    Confirm弹出框,主要是让用户确认是否要进行某个操作。 有两个选择供用户选择,分别是OK(确定)和Cancel(取消)。
    Selenium提供如下方法进行操作:

    # 点击OK(确定)按钮
    driver.switch_to.alert.accept()
    
    # 点击Cancel(取消)按钮
    driver.switch_to.alert.dismiss()
    

    3. Prompt(提示输入)

    出现Prompt弹出框是需要用户输入一些信息,提交上去。
    Selenium提供如下方法进行操作:

    driver.switch_to.alert.send_keys()
    

    使用上面两种方法死活都定位不到的弹出层

    比如这种:

    遇到这个问题做了以下尝试:

    1.首先,这种肯定不是alert,所以不能用alert去定位
    2.然后看看是不是有iframe,查看元素后,发现没有iframe
    3.前面加了sleep时间等待也无法解决

    解决方法:
    1.通过打印获取全部的窗口,发现打印出来的是两个handle,也就是说,这个表面上看起来是一个窗口,实际上内嵌了另外一个窗口.

    # 打印所有的handle
    all_handles = driver.window_handles
    print(all_handles)
    
    # 切换到新的handle上
    driver.switch_to.window(all_handles[-1])
    

    2.找到问题原因,接下来就简单了,先切换到新的窗口上,然后用平常的定位方法就可以了

    但如果是在循环中这样写的话需要将 driver 对象在每次循环开始的时候重置为当前操作的窗口.
    不然会报错找不到正常网页窗口中的对象.
    循环的例子:

     for i in range(0, 15):
            # 打印所有的handle
            all_handles = driver.window_handles
            print(all_handles)
            # 切换到主页面的handle上
            driver.switch_to.window(all_handles[-1])
    
            a_title = test.get_attribute('title')
    
            if a_title == '恢复页面':
                # 获取确认提示弹窗对象
                # 打印所有的handle
                all_handles = driver.window_handles
                print(i, all_handles)
    
                # 切换到新的handle上
                driver.switch_to.window(all_handles[0])
                # 找到弹窗内的确认按钮
                alertbox_btn = driver.find_element(by=By.CSS_SELECTOR, value='p.from-btn>a.ok')
                # 点击确认按钮
                alertbox_btn.click()
    
                sleep(2)
    

    其他实用辅助方法:

    滚动条操作:

    将滚动条定位至指定元素可见:

    # 将滚动条定位至指定元素可见
    driver.execute_script('arguments[0].scrollIntoView()', elem)
    # 移动到元素的‘低端’与当前窗口的‘底部’对齐
    driver.execute_script('arguments[0].scrollIntoView(false)', elem)
    # 移动到元素的“顶端”与当前窗口的“顶部”对齐
    driver.execute_script('arguments[0].scrollIntoView(true)', elem)
    

    获取元素大小,位置坐标:

    获取元素的宽高(大小)

    # 打开百度
    driver.get("https://www.baidu.com")
    # 定位百度搜索输入框元素
    ele = driver.find_element(By.XPATH, "//input[@id='kw']")
    # 获取元素大小
    ele_size = ele.size
    print(type(ele_size))
    print(ele_size)
    

    输出结果:

    <class 'dict'>
    {'height': 44.0, 'width': 548.0}
    

    获取元素的位置坐标:

    # 打开百度
    driver.get("https://www.baidu.com")
    # 定位百度首页的地图按钮
    ele = driver.find_element(By.XPATH, "//a[@class='mnav c-font-normal c-color-t']")
    # 获取元素的位置
    ele_location = ele.location
    print(ele_location)
    

    输出结果:

    {'x': 24, 'y': 19}
    

    判断元素是否可以点击,选中,是否可见:

    1.判断元素是否可以点击
    判断元素是否可以点击,WebElement对象调用is_enabled()
    is_enabled()方法返回一个布尔值,若可点击返回:True。若不可点击则返回:False

    driver = webdriver.Chrome()
    # 打开百度
    driver.get('https://www.baidu.com/')
    # 定位百度首页的地图按钮
    elm = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[3]')
    # 判断元素是否可以点击
    answer = elm.is_enabled()
    print(answer)
    time.sleep(3)
    driver.quit()
    
    #####输出结果:#####
    True
    

    2.判断元素是否可见
    判断元素是否可见,WebElement对象调用is_displayed()
    is_displayed()方法返回一个布尔值,若可见则返回:True。若不可见则返回:False

    driver = webdriver.Chrome()
    # 打开百度
    driver.get('https://www.baidu.com/')
    # 定位百度首页的地图按钮
    elm = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[3]')
    # 判断元素是否可见
    answer = elm.is_displayed()
    print(answer)
    driver.quit()
    
    #####输出结果:#####
    True
    

    3.判断元素是否可被选中
    判断元素是否被选中,WebElement对象调用is_selected()
    is_selected()方法返回一个布尔值,若可见则返回:True。若不可见则返回:False

    driver = webdriver.Chrome()
    # 打开百度
    driver.get('https://www.baidu.com/')
    # 定位百度首页的地图按钮
    elm = driver.find_element(By.XPATH, '//*[@id="s-top-left"]/a[3]')
    # 判断元素是否可选中
    answer = elm.is_selected()
    print(answer)
    driver.quit()
    
    #####输出结果:#####
    False
    

    -End-

    风影OvO

    风影OvO, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA 4.0协议进行授权 | 转载请注明原文链接

    留下你的评论

    *评论支持代码高亮<pre class="prettyprint linenums">代码</pre>

    相关推荐