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

Posted 给自己一个向前进的理由

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

以上是关于Python+Selenium框架版- 进一步实现POM和可能遇到问题解决方法的主要内容,如果未能解决你的问题,请参考以下文章

免费送书 | python版《Selenium WebDriver 3.0 自动化测试框架实战指南》

Python+selenium+unittest的GUI自动化框架实现

Python+Selenium框架设计篇之4-框架内封装基类和实现POM

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

(上)python3 selenium3 从框架实现学习selenium让你事半功倍

(上)python3 selenium3 从框架实现学习selenium让你事半功倍