Python+Selenium框架版(七)- 进一步实现POM和可能遇到问题解决方法

  目标:实现三个页面,两个测试脚本。

  练习场景:新建了2个页面对象:百度新闻首页,百度体育新闻首页,具体文件结构如下图,其他和之前项目层级结构保持不变。

  1.百度首页页面类代码(baidu_homepage.py),定义了百度新闻的入口

from framework.base_page import BasePage

class HomePage(BasePage):
    input_box = "id=>"
    search_submit_btn = "xpath=>//*[@id=‘su‘]"
    # 百度新闻入口
    news_link = "xpath=>//*[@id=‘u1‘]/a[@name=‘tj_trnews‘]"

    def type_search(self,text):
        self.type(self.input_box,text)

    def send_submit_btn(self):
        self.click(self.search_submit_btn)

    def click_news(self):
        self.click(self.news_link)
        self.sleep(2)

  

  2.百度新闻首页的页面类代码(baidu_news_home.py),定义了体育新闻入口

from framework.base_page import BasePage

class NewsHomePage(BasePage):
    # 点击体育新闻入口
    sport_link = "xpath=>//*[@id=‘channel-all‘]/div/ul/li[7]/a[@href=‘/sports‘]"

    def click_sports(self):
        self.click(self.sport_link)
        self.sleep(2)

  

  3.百度体育新闻页面类代码(news_sports_home.py)

from framework.base_page import BasePage

class SportNewsHomePage(BasePage):
    # NBA 第一条新闻
    nba_link = "xpath=>//*[@id=‘col_nba‘]/div[1]/div[2]/ul[1]/li[1]/a"

    def click_nba_link(self):
        self.click(self.nba_link)
        self.sleep(2)

  

  4.测试类代码(test_nba_news_view.py)

import time
import unittest
from framework.browser_engine import BrowserEngine
from pageobjects.baidu_homepage import HomePage
from pageobjects.baidu_news_home import NewsHomePage
from pageobjects.news_sport_home import SportNewsHomePage

class ViewNBANews(unittest.TestCase):
    def setUp(self):
        browse = BrowserEngine(self)
        self.driver = browse.open_browser(self)

    def tearDown(self):
        self.driver.quit()

    def test_view_nba_views(self):
        # 初始化百度首页,并点击新闻链接
        baiduhome = HomePage(self.driver)
        baiduhome.click_news()
        # 初始化一个百度新闻主页对象,点击体育
        newshome = NewsHomePage(self.driver)
        newshome.click_sports()
        # 初始化一个体育新闻主页,点击NBA
        sportnewhome = SportNewsHomePage(self.driver)
        sportnewhome.click_nba_link()
        sportnewhome.get_window_img()

if __name__ == ‘__main__‘:
    unittest.main()

  

  按照博主的会出现报错:

StaleElementReferenceException: Message: stale element reference: element is not attached to the page document

  其实,该报错是源于base_page.py里面的,注释掉就能跑下去了。

    def click(self,selector):
        """
        点击元素
        :param selector:
        :return:
        """
        el = self.find_element(selector)
        try:
            el.click()
            #logger.info("The element \‘ %s \‘ was clicked." %el.text)
            #这一句错了
            #错在点击“新闻”后的记录日志,日志中传的参数是“新闻”元素的text属性值。
            #我理解此时点击了新闻后页面切换到新闻页面了,所以找不到“新闻”元素了。
        except NameError as e:
            logger.error("Fail to click the element with %s" %e)

  

参考文章:https://blog.csdn.net/u011541946/article/details/70375555

原文地址:https://www.cnblogs.com/zhaocbbb/p/12672236.html

时间: 2024-10-30 08:11:24

Python+Selenium框架版(七)- 进一步实现POM和可能遇到问题解决方法的相关文章

《一头扎进》系列之Python+Selenium框架实战篇4- 价值好几K的框架,呵!这个框架有点意思啊!!!

1.简介 前面文章,我们实现了框架的一部分功能,包括日志类和浏览器引擎类的封装,今天我们继续封装一个基类和介绍如何实现POM.关于基类,是这样定义的:把一些常见的页面操作的selenium封装到base_page.py这个类文件,以后每个POM中的页面类,都继承这个基类,这样每个页面类都有基类的方法,这个我们会在这篇文章由宏哥实现. 2.项目层级结构 1. 上一篇中我们已经创建好了项目层级结构,具体项目层级结构如下图.这里不再赘述,相关文件也如下: 3. 定位和截图类封装 1. 在实现封装基类里

《一头扎进》系列之Python+Selenium框架设计篇6 - 价值好几K的框架,呦!这个框架还真牛叉哦!!!

1. 简介 本文开始介绍如何通过unittest来管理和执行测试用例,这一篇主要是介绍unittest下addTest()方法来加载测试用例到测试套件中去.用addTest()方法来加载我们测试用例到suite中去和利用discover()方法去加载一个路径下所有的测试用例. 2. addTest()方法 这里首先介绍unittest下addTest()方法来加载测试用例到测试套件中去.为了演示效果,我在前面文章的脚本基础上,新建了一个测试脚本,这个测试脚本有一个测试用例,加上前面的测试脚本,一

《一头扎进》系列之Python+Selenium框架设计篇3- 价值好几K的框架,狼来了,狼来了....,狼没来,框架真的来了

1. 简介 前边宏哥一边一边的喊框架,就如同一边一边的喊狼来了!狼来了!.....这回是狼没有来,框架真的来了.从本文开始宏哥将会一步一步介绍,如何从无到有地创建自己的第一个自动化测试框架.这一篇,我们介绍,如何封装自己的日志类和浏览器引擎类. 2. 创建项目层级结构 如何创建,怎么创建.这个就需要我们前边介绍的框架概要设计以及框架的详细设计的思维导图,宏哥就是根据那个图,轻松地.清楚的.思路清晰地一步一步创建项目层级结构. 相关步骤: 1. 打开PyCharm,创建如下格式的项目层级结构,为了

Python Selenium框架

目录 1.selenium介绍 2.selenium安装 3.selenium常用操作 4.QQ空间模拟登陆 5.图片懒加载 1. selenium介绍 # 介绍: 1.selenium是一个web自动化测试用的框架. 程序员可以通过代码实现对浏览器的控制, 比如打开网页, 点 击网页中的元素, 实现鼠标滚动等操作. 2.它支持多款浏览器, 如谷歌浏览器, 火狐浏览器等等, 当然也支持无头浏览器. # 目的: 在爬取数据的过程中, 经常遇到动态数据加载, 一般动态数据加载有两种, 一种通过aja

Python+Selenium笔记(七):WebDriver和WebElement

(一)  WebDriver WebDriver提供许多用来与浏览器交互的功能和设置,通过WebDriver的功能和一些方法,来实现与浏览器窗口.警告.框架和弹出窗口的交互,它也提供了自动化操作浏览器导航栏.设置cookies.截屏等方便我们测试的特性. (二)  WebDriver功能及方法 功能/属性 简单说明 current_url 获取当前页面的URL地址(driver.current_url) 下面的都是以这种方式,driver指浏览器驱动实例. window_handle 获取当前窗

Python+Selenium进阶版(二)- Python中类/函数/模块的简单介绍

关于Python中类和函数及方法的调用,我们写在这个demo.py文件,具体代码如下: # coding = utf-8 class ClassA(object): string1 = "这是一个字符串." def insteancefunc(self): print('这是一个实例方法.') print(self) @classmethod def classfunc(cls): print('这是一个类方法.') print(cls) @staticmethod def stati

Python+Selenium进阶版(八)- Python自定义封装一个简单的Log类

目标:如何写一个Python日志类,用来输出不同级别的日志信息到本地文件夹下的日志文件里. 练习场景: 我们需要封装一个简单的日志类,主要有以下内容: 1.生成的日志文件格式是 年月日分秒.log 2.生成的XXX.log文件存储在项目根目录下Logs文件夹下 3.这个日志类,支持INFO,ERROR两种日志级别 4.日志里,每行日志输出,时间日期+执行类名称+日志级别+日志描述 解决思路: 1.在根目录下新建一个Logs的文件夹,获取这个Log的相对路径: 2.日志的保存命名,需要系统时间:

springboot学习入门简易版七---springboot2.0使用@Async异步执行方法(17)

1启动类开启异步调用注解 @SpringBootApplication @EnableAsync //开启异步调用 public class StartApplication { 不开启则异步调用无效 2编写异步调用方法 @RestController public class AsyncController { private final static Logger logger=LoggerFactory.getLogger(WebLogAspect.class); @Autowired p

转 Python Selenium设计模式-POM

前言 本文就python selenium自动化测试实践中所需要的POM设计模式进行分享,以便大家在实践中对POM的特点.应用场景和核心思想有一定的理解和掌握. 为什么要用POM 基于python selenium2开始UI级自动化测试并不是多么艰巨的任务.只需要定位到元素,执行对应的操作即可.下面我们看一下这个简单的脚本实现百度搜索. from selenium import webdriver import time driver = webdriver.Firefox() driver.i