python3.8.1+selenium3.141.0获取表单中最新的一行数据,复用脚本

实现脚本如下:

from selenium import webdriver
import unittest
from time import sleep
from time import *
import json

class testInterFace(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Chrome()
        self.driver.implicitly_wait(30)
        self.driver.set_page_load_timeout(30)
        self.driver.set_script_timeout(45)
        self.driver.maximize_window()
        self.base_url = "http://ip/域名/"

    def test_add_notice(self):
        driver = self.driver
        username = "账号"
        password = "密码"
        driver.get(self.base_url)
        driver.find_element_by_id("username").send_keys(username)
        driver.find_element_by_id("password").send_keys(password)
        driver.find_element_by_class_name("loginbt").click()
        sleep(2)
        driver.find_element_by_xpath("/html/body/table/tbody/tr[2]/td[1]/div[1]/ul/li[1]/a").click()
        notice_title = "公告标题"+str(time())
        driver.find_element_by_id("headline").send_keys(notice_title)
        driver.switch_to.frame(0)
        notice_content = str(time())+"这是公告的内容,好好准备阅读"+str(time())
        driver.find_element_by_xpath("/html/body").send_keys(notice_content)
        driver.switch_to.default_content()
        driver.find_element_by_id("add").click()
        sleep(2)
        """
        前面的都不是重点,无外乎都是一些登录系统,添加数据,但是成功了之后怎么得到最新的那个数据呢,增、删、查、改
        删除了之后,定死了的东西就没法用了,所以需要获取到页面中最新的那个元素,删了会重新获取直到删完,而且很多开发
        为了产品性能,做的代码结构偏向于id = 10删除了之后,下一个添加的就是id = 11,那么定死了id = 10永远无法获取到
        这里实现其实很简单,用循环得到想要的表格每一行的数据,再通过编程语言去获取到想要的那个数据
        """
        s = driver.find_element_by_id("dataTable")   # 定位到表单所在的位置,获取表单的所有信息
        x = s.find_elements_by_tag_name('tr')   # 定位到表单下的所有tr标签,有一些不是表单中tr,比如表头什么的不属于表单内容
        lenbefore = len(x)-2   # 得到表单的行数,这里其实实际上是len(x)-3,但是后续为了循环才是-2,这个要自己去数表单下哪些->
                               # tr标签不是属于表单内容
        dict = {}   # 定义一个空的字典,这里其实有点多余,当时也是为了尝试,后来没改,也可以定义dict1 = dict()
        for i in range(1,lenbefore):   # 将表单行数用for循环,注意:这里的表单行数单纯指的是表格内容信息,而不是表头和其他信息
            y = driver.find_element_by_xpath(f"//*[@id='dataPanel']/tr[{i}]").text   # 通过格式化字符串得到表中每一行的文本
            tt: str = f"标题+{i}"   # 这里因为定义了字典的keys,其实返回的y已经是字符串了,可以用split切割了,当时想复杂了
            dict[f"{tt}"] = y   # 将字典中加入值,这里有不同的方法可以添加,我用的简单的键值对插入
        print(dict)
        z = json.dumps(dict)   # 多此一举的结果就是要将字典转换为json字符串,否则不能用split切割
        result = z.split(":")[1]   # 去掉key,取values的值,只取第一项,其他舍弃,第一项才是表中最新添加的那一行
        print(result)
        result1 = result.split("\\")[0]  # 通过json.dumps()转义之后会将中文字符转码,会变成\u516c\u544a\u6807\u9898这样,
                                         # 我这里是这样,\\是为了反转义,别的表格如果不是中文则需要视情形而定
        result2 = result1.split('"')[1]  # 按照"切割,同理,视情形而定
        real_noticeid = result2.strip()  # 去除掉空格,同理还有lstrip去除左侧空格,rstrip去除右侧空格
        sleep(2)
        driver.find_element_by_xpath(f"//*[@id='dtrow_{real_noticeid}']/td[5]/label[2]").click()  # 删除最新添加的一行数据
        sleep(2)
        alert = driver.switch_to.alert  # 处理删除确认提示弹框,对应的很多操作可以自行百度
        alert.accept()  # 点击确定按钮
        sleep(3)
        delete_notice_info = driver.find_element_by_id("msg").text  # 得到删除成功的文本值
        # 断言删除成功提示与页面删除获取的提示一致,个人觉得没必要,视情形而定,有些是显性的就没必要,隐形的还是有必要的
        self.assertEqual(f"成功啦: 删除数据成功 -> 编号={real_noticeid}",delete_notice_info,"删除失败,请重新操作!!")
        print(f"成功啦: 删除数据成功 -> 编号={real_noticeid}")  # 打印删除信息
        driver.find_element_by_link_text("注销").click()  # 退出系统

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

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

你可能感兴趣的:(测试)