1#!/usr/bin/env python
2# -*- coding: utf-8 -*-
3
4# Copyright (c) 2022 Shenzhen Kaihong Digital Industry Development Co., Ltd.
5#
6# HDF is dual licensed: you can use it either under the terms of
7# the GPL, or the BSD license, at your option.
8# See the LICENSE file in the root of this repository for complete details.
9
10from asyncio import subprocess
11import os
12import time
13import warnings
14
15import easyocr
16import pytest
17from PIL import Image
18from selenium import webdriver
19from selenium.webdriver import ActionChains
20
21from public_moudle.base import Base
22
23warnings.filterwarnings("ignore", category=UserWarning)
24
25
26class TestHcsTool:
27    driver = webdriver.Chrome()
28    test = Base(driver)
29    url = test.getfiledir()
30
31    @staticmethod
32    def setup_class():
33        # Determine whether the index.html file in the local project
34        # can be opened and used before executing the use case
35        filelist = os.listdir('../../dist')
36        if len(filelist) < 2:
37            os.chdir('../../')
38            subprocess.run(["python", "build.py"])
39        else:
40            return
41
42    def setup(self):
43        # Open a web page in your browser
44        self.driver.get(self.url)
45        time.sleep(1)
46
47    def teardown(self):
48        # Data cleaning
49        print('Clear cookies and exit the login state')
50        self.driver.delete_all_cookies()
51        self.driver.refresh()
52        time.sleep(1)
53
54    def teardown_class(self):
55        # When the use case is complete, close the browser
56        self.driver.quit()
57
58    def test_rootselfattr(self):
59        el = self.test.find_element(('id', 'visual_area'))
60        loc = self.test.get_canvas_point_position(
61            './Program_pictures/rootselfattr.png', 'root')
62        self.test.click_canvas_point(el, loc[0], loc[1])
63        time.sleep(2)
64        rootname = self.driver.find_element_by_class_name('att_title').text
65        assert rootname == 'root'
66        nodetype = self.driver.find_element_by_xpath(
67            '/html/body/div/select/option[1]').text
68        assert nodetype == '数据类不继承'  # The node type is data class and does not inherit
69        result = self.test.get_attribute(('id', 'node_type'), 'disabled')
70        assert result == 'true'  # The node type cannot be modified
71        nodename = self.test.get_attribute(('id', 'name'), 'value')
72        assert nodename == 'root'  # The node name is root
73        nameedit = self.test.get_attribute(('id', 'name'), 'disabled')
74        assert nameedit == 'true'  # The node name cannot be modified
75        self.driver.refresh()
76        time.sleep(1)
77        self.test.add_node('root')  # add node
78        time.sleep(0.5)
79        self.driver.refresh()  # Refresh the page
80        time.sleep(1)
81        self.test.add_attr('root')  # add attr
82        time.sleep(0.5)
83        self.driver.refresh()
84        time.sleep(1)
85        self.test.click_canvas_by_text('root')  # click root
86        self.test.click(('id', 'delete'))  # click delete button
87        path = './Program_pictures/rootselfattr1.png'
88        self.driver.get_screenshot_as_file(path)
89        Image.open(path).crop((0.8 * 929, 0, 929, 0.3 * 888)).save(path)
90        reader = easyocr.Reader(['ch_sim', 'en'], verbose=False)
91        nodecount = reader.readtext(path)
92        assert len(
93            nodecount
94        ) == 1  # Gets the number of elements in the property edit area
95
96    def test_addnodedata(self):
97        time.sleep(0.5)
98        self.test.add_node('root')
99        time.sleep(1)
100        topname = self.driver.find_element_by_class_name('att_title').text
101        assert topname == 'node_1'
102        nodetype = self.driver.find_element_by_xpath(
103            '/html/body/div/select/option[1]').text
104        assert nodetype == '数据类不继承'
105        self.test.sendkeys(('id', 'name'), 'nodeceshi')
106        time.sleep(0.5)
107        flag = self.test.node_in_kuang('./Program_pictures/addnodedata1.png',
108                                       'nodeceshi')
109        assert flag is True
110        self.test.click(('id', 'add_child_node'))  # add node
111        time.sleep(0.5)
112        self.test.click(('id', 'add_child_attr'))  # add attr
113        time.sleep(0.5)
114        self.test.click_canvas_by_text('nodeceshi')  # delete node_1(nodeceshi)
115        self.test.click(('id', 'delete'))
116        deletnode = self.test.node_in_kuang(
117            './Program_pictures/addnodedata2.png', 'nodeceshi')
118        assert deletnode is False
119
120    def test_datamodifycopy(self):
121        self.test.add_node('root')  # add & click node
122        time.sleep(0.5)
123        self.driver.find_element_by_xpath(
124            '/html/body/div/select/option[2]').click()  # change node type copy
125        time.sleep(0.5)
126        result = self.test.get_attribute(
127            ('id', 'node_type'), 'disabled')  # node type cannot modified
128        assert result == 'true'
129        copyflag = self.test.kuang_contain_text(
130            './Program_pictures/datamodifycopy1.png', "复制目标没找到")
131        assert copyflag is True
132        self.test.click(('id', 'change_target'))  # click copy button
133        time.sleep(0.5)
134        selecttarget = self.test.kuang_contain_text(
135            './Program_pictures/datamodifycopy2.png', "点击选")
136        assert selecttarget is True
137        canceltarget = self.test.kuang_contain_text(
138            './Program_pictures/datamodifycopy3.png', "取消选择")
139        assert canceltarget is True
140        self.test.sendkeys(('id', 'name'), 'hhhh')  # modify node name
141        time.sleep(0.5)
142        containhhhh = self.test.kuang_contain_text(
143            './Program_pictures/datamodifycopy4.png', 'hhhh')
144        assert containhhhh is True
145
146    def test_copyself(self):
147        el = self.test.find_element(('id', 'visual_area'))
148        nodeloc = self.test.add_node('root')  # add & click node
149        time.sleep(0.5)
150        self.driver.find_element_by_xpath(
151            '/html/body/div/select/option[2]').click()  # change node type copy
152        time.sleep(0.5)
153        self.test.click(('id', 'change_target'))  # click copy button
154        time.sleep(0.5)
155        loc = self.test.get_obtain_point_position(
156            './Program_pictures/copyself1.png', '点击选')
157        self.test.click_canvas_point(el, 650, 700)
158        time.sleep(0.5)
159        loc1 = self.test.get_obtain_point_position(
160            './Program_pictures/copyself2.png', '点击选')
161        assert loc[0] != loc1[0] and loc[1] != loc1[1]
162        self.test.sendkeys(('id', 'name'), 'hhhh')  # modify node name
163        time.sleep(0.5)
164        self.test.click_canvas_point(el, nodeloc[0], nodeloc[1])  # copy self
165        time.sleep(0.5)
166        selecttarget = self.test.kuang_contain_text(
167            './Program_pictures/copyself3.png', "点击选")
168        assert selecttarget is False
169        canceltarget = self.test.kuang_contain_text(
170            './Program_pictures/copyself4.png', "取消选择")
171        assert canceltarget is False
172        copyflag = self.test.kuang_contain_text(
173            './Program_pictures/copyself5.png', "循环复制")
174        assert copyflag is True
175        unknowexit = self.test.node_in_kuang(
176            './Program_pictures/copyself6.png', 'unknow')
177        assert unknowexit is False
178
179    def test_modiycopy(self):
180        el = self.test.find_element(('id', 'visual_area'))
181        nodeloc = self.test.add_node('root')  # add & click node
182        time.sleep(0.5)
183        self.driver.find_element_by_xpath(
184            '/html/body/div/select/option[2]').click()  # change node type copy
185        self.test.click(('id', 'change_target'))  # click copy button
186        self.test.click_canvas_point(el, nodeloc[0], nodeloc[1])  # copy self
187        time.sleep(0.5)
188        self.test.click(('id', 'change_target'))  # clck copy button
189        time.sleep(1)
190        self.test.click_canvas_by_text('nodeaa')  # copy nodeaa
191        time.sleep(1)
192        text = self.driver.find_element_by_id('change_target').text
193        assert text == 'nodeaa'
194
195    def test_modifycopyname(self):
196        time.sleep(1)
197        nodeloc = self.test.add_node('root')  # add & click node
198        time.sleep(0.5)
199        self.driver.find_element_by_xpath(
200            '/html/body/div/select/option[2]').click()  # change node type copy
201        self.test.click(('id', 'change_target'))  # click copy button
202        self.test.click_canvas_by_text('nodeaa')  # copy nodeaa
203        time.sleep(0.5)
204        loc = self.test.get_canvas_point_position(
205            './Program_pictures/modifycopyname1.png', 'nodeaa')
206        el = self.test.find_element(('id', 'visual_area'))
207        self.test.click_canvas_point(el, loc[0], loc[1])  # click nodeaa
208        time.sleep(0.5)
209        self.test.sendkeys(('id', 'name'), 'nodeff')  # modify nodeaa name
210        text = self.test.get_attribute(('id', 'name'), 'value')
211        assert text == 'nodeff'
212        time.sleep(0.5)
213        self.test.click_canvas_point(el, nodeloc[0],
214                                     nodeloc[1])  # click node_1 again
215        self.test.click(('id', 'change_target'))  # click copy button
216        time.sleep(0.5)
217        self.test.click_canvas_point(el, loc[0], loc[1])  # copy nodeff  again
218        time.sleep(0.5)
219        copyname = self.driver.find_element_by_id('change_target').text
220        assert copyname == 'nodeff'
221
222    def test_copyattr(self):
223        time.sleep(1)
224        self.test.add_node('root')  # add & click node
225        time.sleep(0.5)
226        self.driver.find_element_by_xpath(
227            '/html/body/div/select/option[2]').click()  # change node type copy
228        self.test.click(('id', 'change_target'))  # click copy button
229        self.test.click_canvas_by_text('extstring')  # copy extstring
230        time.sleep(0.5)
231        cancelselect = self.test.kuang_contain_text(
232            './Program_pictures/copyattr.png', "取消选择")
233        assert cancelselect is True
234
235    def test_cancelcopy(self):
236        self.test.add_node('root')  # add & click node
237        time.sleep(0.5)
238        self.driver.find_element_by_xpath(
239            '/html/body/div/select/option[2]').click()  # change node type copy
240        self.test.click(('id', 'change_target'))  # click copy button
241        self.test.click_canvas_by_text('取消选择')  # click cancel copy button
242        time.sleep(0.5)
243        cancelselect = self.test.kuang_contain_text(
244            './Program_pictures/cancelselect1.png', "取消选择")
245        assert cancelselect is False
246        selecttarget = self.test.kuang_contain_text(
247            './Program_pictures/cancelselect2.png', "点击选")
248        assert selecttarget is False
249        copyflag = self.test.kuang_contain_text(
250            './Program_pictures/cancelselect3.png', "复制目标没找到")
251        assert copyflag is True
252
253    def test_reference(self):
254        self.test.add_node('root')  # add & click node
255        time.sleep(0.5)
256        self.driver.find_element_by_xpath(
257            '/html/body/div/select/option[3]').click(
258            )  # change node type reference
259        time.sleep(0.5)
260        result = self.test.get_attribute(
261            ('id', 'node_type'), 'disabled')  # node type cannot modified
262        assert result == 'true'
263        referenceflag = self.test.kuang_contain_text(
264            './Program_pictures/reference1.png', "目标没找到")
265        assert referenceflag is True
266        self.test.click(('id', 'change_target'))  # click reference button
267        time.sleep(0.5)
268        selecttarget = self.test.kuang_contain_text(
269            './Program_pictures/reference2.png', "点击选")
270        assert selecttarget is True
271        canceltarget = self.test.kuang_contain_text(
272            './Program_pictures/reference3.png', "取消选择")
273        assert canceltarget is True
274
275    def test_referenceself(self):
276        el = self.test.find_element(('id', 'visual_area'))
277        nodeloc = self.test.add_node('root')  # add & click node
278        time.sleep(0.5)
279        self.driver.find_element_by_xpath(
280            '/html/body/div/select/option[3]').click(
281            )  # change node type reference
282        time.sleep(0.5)
283        self.test.click(('id', 'change_target'))  # click reference button
284        time.sleep(0.5)
285        loc = self.test.get_obtain_point_position(
286            './Program_pictures/referenceself1.png', '点击选择')
287        self.test.click_canvas_point(el, 650, 700)
288        time.sleep(0.5)
289        loc1 = self.test.get_obtain_point_position(
290            './Program_pictures/referenceself2.png', '点击选择')
291        assert loc[0] != loc1[0] and loc[1] != loc1[1]
292        self.test.sendkeys(('id', 'name'), 'hhhh')  # modify node name
293        time.sleep(0.5)
294        self.test.click_canvas_point(el, nodeloc[0],
295                                     nodeloc[1])  # refence self
296        time.sleep(0.5)
297        selecttarget = self.test.kuang_contain_text(
298            './Program_pictures/referenceself3.png', "点击选择")
299        assert selecttarget is False
300        canceltarget = self.test.kuang_contain_text(
301            './Program_pictures/referenceself4.png', "取消选择")
302        assert canceltarget is False
303        copyflag = self.test.kuang_contain_text(
304            './Program_pictures/referenceself5.png', "环引用")
305        assert copyflag is True
306        text = self.driver.find_element_by_id('change_target').text
307        assert text == 'hhhh'
308
309    def test_modifyreference(self):
310        el = self.test.find_element(('id', 'visual_area'))
311        nodeloc = self.test.add_node('root')  # add & click node
312        time.sleep(0.5)
313        self.driver.find_element_by_xpath(
314            '/html/body/div/select/option[3]').click(
315            )  # change node type to reference
316        self.test.click(('id', 'change_target'))  # click reference button
317        self.test.click_canvas_point(el, nodeloc[0],
318                                     nodeloc[1])  # refence self
319        time.sleep(0.5)
320        self.test.click(('id', 'change_target'))  # click reference button
321        time.sleep(1)
322        self.test.click_canvas_by_text('nodeaa')  # reference nodeaa
323        time.sleep(1)
324        text = self.driver.find_element_by_id('change_target').text
325        assert text == 'nodeaa'
326
327    def test_modifyrefename(self):
328        nodeloc = self.test.add_node('root')  # add & click node
329        time.sleep(0.5)
330        self.driver.find_element_by_xpath(
331            '/html/body/div/select/option[3]').click(
332            )  # change node type to reference
333        self.test.click(('id', 'change_target'))  # click reference button
334        self.test.click_canvas_by_text('nodeaa')  # reference nodeaa
335        time.sleep(0.5)
336        loc = self.test.get_canvas_point_position(
337            './Program_pictures/modifyrefename1.png', 'nodeaa')
338        el = self.test.find_element(('id', 'visual_area'))
339        self.test.click_canvas_point(el, loc[0], loc[1])  # click nodeaa
340        time.sleep(0.5)
341        self.test.sendkeys(('id', 'name'), 'nodeff')  # modify nodeaa  name
342        text = self.test.get_attribute(('id', 'name'), 'value')
343        assert text == 'nodeff'
344        time.sleep(0.5)
345        self.test.click_canvas_point(el, nodeloc[0],
346                                     nodeloc[1])  # click node_1
347        self.test.click(('id', 'change_target'))  # click reference button
348        time.sleep(0.5)
349        self.test.click_canvas_point(el, loc[0], loc[1])  # reference nodeff
350        time.sleep(0.5)
351        refename = self.driver.find_element_by_id('change_target').text
352        assert refename == 'nodeff'
353
354    def test_refeattr(self):
355        print("")
356        self.test.add_node('root')  # add & click node
357        time.sleep(0.5)
358        self.driver.find_element_by_xpath(
359            '/html/body/div/select/option[3]').click(
360            )  # change node type reference
361        self.test.click(('id', 'change_target'))  # click reference button
362        self.test.click_canvas_by_text('extstring')  # reference extstring
363        time.sleep(0.5)
364        cancelselect = self.test.kuang_contain_text(
365            './Program_pictures/refeattr.png', "取消选择")
366        assert cancelselect is True
367
368    def test_cancelrefe(self):
369        self.test.add_node('root')  # add & click node
370        time.sleep(0.5)
371        self.driver.find_element_by_xpath(
372            '/html/body/div/select/option[3]').click(
373            )  # change node type reference
374        self.test.click(('id', 'change_target'))  # click reference button
375        self.test.click_canvas_by_text('取消选择')  # click cancel reference button
376        time.sleep(0.5)
377        cancelselect = self.test.kuang_contain_text(
378            './Program_pictures/cancelrefe1.png', "取消选择")
379        assert cancelselect is False
380        selecttarget = self.test.kuang_contain_text(
381            './Program_pictures/cancelrefe2.png', "点击选")
382        assert selecttarget is False
383        copyflag = self.test.kuang_contain_text(
384            './Program_pictures/cancelrefe3.png', "目标没找到")
385        assert copyflag is True
386
387    def test_delete(self):
388        self.test.add_node('root')  # add & click node
389        time.sleep(0.5)
390        self.driver.find_element_by_xpath('/html/body/div/select/option[4]'
391                                          ).click()  # change node type delete
392        time.sleep(0.5)
393        result = self.test.get_attribute(
394            ('id', 'node_type'), 'disabled')  # node type cannot modified
395        assert result == 'true'
396        self.test.click(('id', 'delete'))  # click delete button
397        time.sleep(0.5)
398        deleteexit = self.test.kuang_contain_text(
399            './Program_pictures/delete.png', "delete")
400        assert deleteexit is False
401
402    def test_templete(self):
403        self.test.add_node('root')  # add & click node
404        time.sleep(0.5)
405        self.driver.find_element_by_xpath('/html/body/div/select/option[5]'
406                                          ).click()  # change node type templete
407        time.sleep(0.5)
408        result = self.test.get_attribute(
409            ('id', 'node_type'), 'disabled')  # node type cannot modified
410        assert result == 'true'
411        time.sleep(0.5)
412        self.test.click(('id', 'add_child_node'))
413        self.test.click(('id', 'add_child_attr'))
414
415    def test_inheritance(self):
416        self.test.add_node('root')  # add & click node
417        time.sleep(0.5)
418        # Change the node type to inheritance class
419        self.driver.find_element_by_xpath(
420            '/html/body/div/select/option[6]').click()
421        time.sleep(0.5)
422        result = self.test.get_attribute(
423            ('id', 'node_type'), 'disabled')  # node type cannot modified
424        assert result == 'true'
425        referenceflag = self.test.kuang_contain_text(
426            './Program_pictures/inheritance1.png', "不到继承目标")
427        assert referenceflag is True
428        self.test.click(
429            ('id', 'change_target'))  # Click the Inheritance button
430        time.sleep(0.5)
431        selecttarget = self.test.kuang_contain_text(
432            './Program_pictures/inheritance2.png', "点击选")
433        assert selecttarget is True
434        canceltarget = self.test.kuang_contain_text(
435            './Program_pictures/inheritance3.png', "取消选择")
436        assert canceltarget is True
437
438    def test_inherself(self):
439        el = self.test.find_element(('id', 'visual_area'))
440        nodeloc = self.test.add_node('root')  # add & click node
441        time.sleep(0.5)
442        # Change the node type to inheritance class
443        self.driver.find_element_by_xpath(
444            '/html/body/div/select/option[6]').click()
445        time.sleep(0.5)
446        self.test.click(
447            ('id', 'change_target'))  # Click the Inheritance button
448        time.sleep(0.5)
449        loc = self.test.get_obtain_point_position(
450            './Program_pictures/inherself1.png', '点击选择')
451        self.test.click_canvas_point(el, 650, 700)
452        time.sleep(0.5)
453        loc1 = self.test.get_obtain_point_position(
454            './Program_pictures/inherself2.png', '点击选择')
455        assert loc[0] != loc1[0] and loc[1] != loc1[1]
456        self.test.sendkeys(('id', 'name'), 'hhhh')
457        time.sleep(0.5)
458        self.test.click_canvas_point(el, nodeloc[0],
459                                     nodeloc[1])  # Inherit  self
460        time.sleep(0.5)
461        selecttarget = self.test.kuang_contain_text(
462            './Program_pictures/inherself3.png', "点击选择")
463        assert selecttarget is False
464        canceltarget = self.test.kuang_contain_text(
465            './Program_pictures/inherself4.png', "取消选择")
466        assert canceltarget is False
467        text = self.driver.find_element_by_id('change_target').text
468        assert text == 'hhhh'
469
470    def test_modifyinher(self):
471        el = self.test.find_element(('id', 'visual_area'))
472        nodeloc = self.test.add_node('root')  # add & click node
473        time.sleep(0.5)
474        # Change the node type to inheritance class
475        self.driver.find_element_by_xpath(
476            '/html/body/div/select/option[6]').click()
477        self.test.click(
478            ('id', 'change_target'))  # Click the Inheritance button
479        self.test.click_canvas_point(el, nodeloc[0],
480                                     nodeloc[1])  # Inherit  self
481        time.sleep(0.5)
482        self.test.click(
483            ('id', 'change_target'))  # Click the Inheritance button
484        time.sleep(1)
485        self.test.click_canvas_by_text('nodeaa')  # Inherit nodeaa
486        time.sleep(1)
487        text = self.driver.find_element_by_id('change_target').text
488        assert text == 'nodeaa'
489
490    def test_modifyinhername(self):
491        self.test.click_canvas_by_text('nodeaa')
492        time.sleep(0.5)
493        self.driver.find_element_by_xpath(
494            '/html/body/div/select/option[5]').click()
495        time.sleep(1)
496        nodeloc = self.test.add_node('root')  # add && click node
497        time.sleep(0.5)
498        # Change the node type to inheritance class
499        self.driver.find_element_by_xpath(
500            '/html/body/div/select/option[6]').click()
501        self.test.click(
502            ('id', 'change_target'))  # Click the Inheritance button
503        self.test.click_canvas_by_text(
504            'templete nodeaa')  # Inherits an existing attribute nodeaa
505        time.sleep(0.5)
506        loc = self.test.get_canvas_point_position(
507            './Program_pictures/modifyinhername1.png', 'templete nodeaa')
508        el = self.test.find_element(('id', 'visual_area'))
509        self.test.click_canvas_point(el, loc[0], loc[1])  # click nodeaa
510        time.sleep(0.5)
511        self.test.sendkeys(('id', 'name'), 'nodeff')  # modify nodeaa name
512        text = self.test.get_attribute(('id', 'name'), 'value')
513        assert text == 'nodeff'  # Verify that the node name is successfully changed
514        time.sleep(0.5)
515        refeflag = self.test.kuang_contain_text(
516            './Program_pictures/modifyinhername2.png', "不能继承数据类节点")
517        assert refeflag is True
518        self.test.click_canvas_point(el, nodeloc[0],
519                                     nodeloc[1])  # Click the node_1 node again
520        self.test.click(
521            ('id', 'change_target'))  # Click the Inheritance button
522        time.sleep(0.5)
523        self.test.click_canvas_point(el, loc[0],
524                                     loc[1])  # Inherit the nodeff node again
525        time.sleep(0.5)
526        refename = self.driver.find_element_by_id('change_target').text
527        assert refename == 'nodeff'
528
529    def test_inheattr(self):
530        self.test.add_node('root')  # add && click node
531        time.sleep(0.5)
532        # Change the node type to inheritance class
533        self.driver.find_element_by_xpath(
534            '/html/body/div/select/option[6]').click()
535        self.test.click(
536            ('id', 'change_target'))  # Click the Inheritance button
537        self.test.click_canvas_by_text(
538            'extstring')  # Inherits an existing attribute node
539        time.sleep(0.5)
540        cancelselect = self.test.kuang_contain_text(
541            './Program_pictures/inheattr.png', "取消选择")
542        assert cancelselect is True  # The deselect button still exists on the canvas
543
544    def test_cancelinher(self):
545        self.test.add_node('root')  # add && click node
546        time.sleep(0.5)
547        # Change the node type to inheritance class
548        self.driver.find_element_by_xpath(
549            '/html/body/div/select/option[6]').click()
550        self.test.click(
551            ('id', 'change_target'))  # Click the Inheritance button
552        self.test.click_canvas_by_text('取消选择')  # click cancal select
553        time.sleep(0.5)
554        cancelselect = self.test.kuang_contain_text(
555            './Program_pictures/cancelinher1.png', "取消选择")
556        assert cancelselect is False  # The deselect button still exists on the canvas
557        selecttarget = self.test.kuang_contain_text(
558            './Program_pictures/cancelinher2.png', "点击选")
559        assert selecttarget is False  # Canvas without prompt click to select target text
560        copyflag = self.test.kuang_contain_text(
561            './Program_pictures/cancelinher3.png', "不到继承目标")
562        assert copyflag is True  # Canvas hint could not find inheritance target
563
564    def test_addattr(self):
565        self.test.add_attr('root')  # add attr
566        attname = self.driver.find_element_by_class_name('att_title').text
567        assert attname == 'attr_1'
568        self.test.sendkeys(('id', 'name'), 'addattr')  # modify attr name
569        flag = self.test.kuang_contain_text('./Program_pictures/addattr1.png',
570                                            'addattr')
571        assert flag == True  # Verify that the property name was successfully modified
572        text = self.driver.find_element_by_xpath(
573            '/html/body/div/select/option[1]').text  # get attr type
574        assert text == '整数'
575        attrvalue = self.test.get_attribute(('id', 'value'),
576                                            'value')  # get attr values
577        assert attrvalue == '0'
578        self.test.sendkeys(('id', 'value'), 3)
579        modifyvalue = self.test.get_attribute(('id', 'value'),
580                                              'value')  # modify attr values
581        assert modifyvalue == '3'
582        self.test.click(('id', 'delete'))  # delete attr
583        deleteattr = self.test.kuang_contain_text(
584            './Program_pictures/addattr2.png', 'addattr')
585        assert deleteattr == False  # Verifying a successful deletion
586
587    def test_modifystring(self):
588        self.test.add_attr('root')
589        time.sleep(0.5)
590        self.driver.find_element_by_xpath(
591            '/html/body/div/select/option[2]').click(
592            )  # change attr type is string
593        time.sleep(0.5)
594        stringtext = self.test.get_attribute(('id', 'value'),
595                                             'value')  # get attr values
596        assert stringtext == ''
597        self.test.sendkeys(('id', 'value'),
598                           'hhh***你好5678')  # modify attr values
599        stringattr = self.test.kuang_contain_text(
600            './Program_pictures/modifystring.png', '你好5678')
601        assert stringattr == True  # Verify modify successfully
602
603    def test_modifyarray(self):
604        self.test.add_attr('root')
605        time.sleep(0.5)
606        self.driver.find_element_by_xpath(
607            '/html/body/div/select/option[3]').click(
608            )  # change attr type is array
609        time.sleep(0.5)
610        stringtext = self.test.get_attribute(('id', 'value'),
611                                             'value')  # get attr values
612        assert stringtext == ''
613        self.test.sendkeys(('id', 'value'),
614                           r"'ceshi',1,2,1,,,,,4")  # modify attr values
615        arrayattr = self.test.kuang_contain_text(
616            './Program_pictures/modifyarray.png', "9]0,1,2,1,0,0,0,0,4")
617        assert arrayattr == True  # Verify modify successfully
618
619    def test_modifybool(self):
620        self.test.add_attr('root')
621        time.sleep(0.5)
622        self.driver.find_element_by_xpath('/html/body/div/select/option[4]'
623                                          ).click()  # change attr type is bool
624        time.sleep(0.5)
625        booltext = self.test.get_attribute(('id', 'value'),
626                                           'value')  # Get property values
627        assert booltext == 'true'
628        self.driver.find_element_by_xpath(
629            '//*[@id="value"]/option[2]').click()  # modify attr false
630        boolattr = self.test.kuang_contain_text(
631            './Program_pictures/modifybool.png', "alse")
632        assert boolattr == True  # Verify the modification
633
634    def test_modifurefe(self):
635        self.test.add_attr('root')
636        time.sleep(0.5)
637        self.driver.find_element_by_xpath(
638            '/html/body/div/select/option[5]').click(
639            )  # change attr type is reference
640        time.sleep(0.5)
641        refeattr = self.test.kuang_contain_text(
642            './Program_pictures/modifurefe1.png', "目标")
643        assert refeattr == True  # Failed to find reference target in validation canvas
644        unknowattr = self.test.kuang_contain_text(
645            './Program_pictures/modifurefe2.png', "Unknow")
646        assert unknowattr == True  # The attribute node name in the validation canvas contains unknow
647        self.test.click(('id', 'change_target'))  # click reference button
648        time.sleep(0.5)
649        # Verify that the property node name in the canvas was changed successfully
650        selectattr = self.test.kuang_contain_text(
651            './Program_pictures/modifurefe3.png', "点击选")
652        assert selectattr == True
653        # The deselect button appears in the lower right corner of the validation canvas
654        cancelselect = self.test.kuang_contain_text(
655            './Program_pictures/modifurefe4.png', "取消选择")
656        assert cancelselect == True
657        loc = self.test.get_obtain_point_position(
658            './Program_pictures/modifurefe5.png', 'extint')
659        el = self.test.find_element(('id', 'visual_area'))
660        self.test.click_canvas_point(el, loc[0], loc[1])  # click extint
661        # The deselect button appears in the lower right corner of the validation canvas
662        clickattr = self.test.kuang_contain_text(
663            './Program_pictures/modifurefe6.png', "取消选择")
664        assert clickattr == True
665        nodeloc = self.test.get_obtain_point_position(
666            './Program_pictures/modifurefe7.png',
667            'nodeaa')  # get nodeaa loction
668        el = self.test.find_element(('id', 'visual_area'))
669        self.test.click_canvas_point(el, nodeloc[0],
670                                     nodeloc[1])  # click nodeaa
671        time.sleep(2)
672        text = self.driver.find_element_by_id(
673            'change_target').text  # get reference button name
674        assert text == 'nodeaa'
675
676    def test_modifydelete(self):
677        self.test.add_attr('root')
678        time.sleep(0.5)
679        self.driver.find_element_by_xpath(
680            '/html/body/div/select/option[6]').click(
681            )  # change attr type is delete
682        time.sleep(0.5)
683        before = self.test.kuang_contain_text(
684            './Program_pictures/modifydelete1.png', "elete")
685        assert before == True
686        self.test.click(('id', 'delete'))  # click delete button
687        after = self.test.kuang_contain_text(
688            './Program_pictures/modifydelete2.png', "elete")
689        assert after == False
690
691    def test_draginkuang(self):
692        beforedrag = self.test.get_canvas_point_position(
693            './Program_pictures/draginkuang1.png', 'root')
694        el = self.test.find_element(('id', 'visual_area'))
695        size = self.driver.get_window_size()
696        height = size.get('height')
697        actions = ActionChains(self.driver)
698        actions.click_and_hold(el).perform()
699        tracks = [num * 50 for num in range(6, 19)]
700        for i in tracks:
701            actions.w3c_actions.pointer_action.source.create_pointer_move(
702                50, i, height - i)
703        for i in tracks[::-1]:
704            actions.w3c_actions.pointer_action.source.create_pointer_move(
705                50, i, 600)
706        actions.release(el)
707        time.sleep(3)
708        actions.move_to_element_with_offset(el, 500, 500).click()
709        afterdrag = self.test.get_canvas_point_position(
710            './Program_pictures/draginkuang2.png', 'root')
711        actions.perform()
712        assert beforedrag[0] == afterdrag[0] and beforedrag[1] == afterdrag[1]
713
714    def test_dragoutkuang(self):
715        beforedrag = self.test.get_canvas_point_position(
716            './Program_pictures/dragoutkuang1.png', 'root')
717        el = self.test.find_element(('id', 'visual_area'))
718        actions = ActionChains(self.driver)
719        actions.click_and_hold(el)
720        lst = [(300, 600), (350, 550), (400, 500), (450, 450), (500, 400),
721               (550, 350), (600, 300), (650, 250), (700, 200), (750, 150),
722               (800, 100), (850, 15)]
723        for i in lst:
724            actions.w3c_actions.pointer_action.source.create_pointer_move(
725                50, i[0], i[1])
726        el1 = self.driver.find_element_by_class_name('att_title')
727        actions.move_to_element(el1).click()
728        loc = self.test.get_canvas_point_position(
729            './Program_pictures/dragoutkuang2.png', 'root')
730        lst1 = [(850, 15), (750, 150), (600, 300), (450, 450), (300, 600),
731                (150, 750)]
732        for i in lst1:
733            actions.w3c_actions.pointer_action.source.create_pointer_move(
734                50, i[0], i[1])
735        actions.move_to_element_with_offset(el, 700, 600).click()
736        afterdrag = self.test.get_canvas_point_position(
737            './Program_pictures/dragoutkuang3.png', 'root')
738        actions.perform()
739        assert beforedrag[0] == afterdrag[0] and beforedrag[1] == afterdrag[1]
740
741    def test_dragel(self):
742        loc = self.test.get_canvas_point_position(
743            './Program_pictures/dragel.png', 'root')
744        el = self.test.find_element(('id', 'visual_area'))
745        self.test.click_canvas_point(el, loc[0], loc[1])
746        actions = ActionChains(self.driver)
747        actions.move_to_element_with_offset(el, loc[0],
748                                            loc[1]).click_and_hold()
749        lst = [(int(loc[0]), int(loc[1])), (100, 100), (300, 300), (400, 400),
750               (500, 500), (600, 600)]
751        for i in lst:
752            actions.w3c_actions.pointer_action.source.create_pointer_move(
753                50, i[0], i[1])
754        actions.perform()
755        time.sleep(2)
756
757    def test_attrcopyself(self):
758        loc = self.test.get_canvas_point_position(
759            './Program_pictures/attrcopyself1.png', 'extstring')
760        el = self.test.find_element(('id', 'visual_area'))
761        self.test.click_canvas_point(el, loc[0], loc[1])
762        self.test.canvas_copy()
763        time.sleep(0.5)
764        copyself = self.test.kuang_contain_text(
765            './Program_pictures/attrcopyself2.png', '己复制')
766        assert copyself is True
767        cancelcopy = self.test.kuang_contain_text(
768            './Program_pictures/attrcopyself3.png', '取消复制')
769        assert cancelcopy is True
770        beforecopy = self.test.text_count(
771            './Program_pictures/attrcopyself4.png', 'string')
772        self.test.canvas_paste()
773        time.sleep(2)
774        aftercopy = self.test.text_count(
775            './Program_pictures/attrcopyself5.png', 'string')
776        assert aftercopy == beforecopy + 1
777        self.test.click_canvas_point(el, loc[0], loc[1] + 25)
778        time.sleep(1)
779        self.test.sendkeys(('id', 'name'), 'string')
780        time.sleep(2)
781        aftereditname = self.test.text_count(
782            './Program_pictures/attrcopyself7.png', '重名')
783        assert aftereditname == 0
784
785    def test_copysamelevelnode(self):
786        self.test.click_canvas_by_text('extstring')  # click extstring
787        self.test.canvas_copy()  # keyboard copy extstring
788        loc = self.test.get_canvas_point_position(
789            './Program_pictures/copysamelevelnode1.png',
790            'nodebb')  # get nodebb location
791        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
792        self.test.click_canvas_point(el, loc[0], loc[1])  # click nodebb
793        self.test.canvas_paste()  # keyboard paste extstring
794        aftercopy = self.test.text_count(
795            './Program_pictures/copysamelevelnode2.png', 'string')
796        assert aftercopy >= 2
797        flag = self.test.kuang_contain_text(
798            './Program_pictures/copysamelevelnode3.png', '重名')
799        assert flag is False
800
801    def test_copysamelevelattr(self):
802        self.test.click_canvas_by_text('extstring')  # click extstring
803        self.test.canvas_copy()  # keyboard copy extstring
804        loc = self.test.get_obtain_point_position(
805            './Program_pictures/copysamelevelattr1.png',
806            'extint')  # get extint location
807        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
808        self.test.click_canvas_point(el, loc[0], loc[1])  # click extint
809        self.test.canvas_paste()  # keyboard paste extstring
810        aftercopy = self.test.text_count(
811            './Program_pictures/copysamelevelattr2.png', 'string')
812        assert aftercopy == 2
813
814    def test_copynextattr(self):
815        self.test.click_canvas_by_text('extstring')  # click extstring
816        self.test.canvas_copy()  # keyboard copy extstring
817        loc = self.test.get_obtain_point_position(
818            './Program_pictures/copynextattr1.png',
819            'childatt')  # get childatt location
820        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
821        self.test.click_canvas_point(el, loc[0], loc[1])  # click childatt
822        self.test.canvas_paste()  # keyboard paste extstring
823        aftercopy = self.test.text_count(
824            './Program_pictures/copynextattr2.png', 'string')
825        assert aftercopy >= 2
826        flag = self.test.kuang_contain_text(
827            './Program_pictures/copynextattr3.png', '重名')
828        assert flag is False
829
830    def test_copynextnode(self):
831        self.test.click_canvas_by_text('extstring')  # click extstring
832        self.test.canvas_copy()  # keyboard copy extstring
833        loc = self.test.get_obtain_point_position(
834            './Program_pictures/copynextnode1.png',
835            'childnode')  # get childnode location
836        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
837        self.test.click_canvas_point(el, loc[0], loc[1])  # click childnode
838        self.test.canvas_paste()  # keyboard paste extstring
839        aftercopy = self.test.text_count(
840            './Program_pictures/copynextnode2.png', 'string')
841        assert aftercopy >= 2
842        flag = self.test.kuang_contain_text(
843            './Program_pictures/copynextnode3.png', '重名')
844        assert flag is False
845
846    def test_attrcopyroot(self):
847        self.test.click_canvas_by_text('extstring')  # click extstring
848        self.test.canvas_copy()  # keyboard copy extstring
849        loc = self.test.get_obtain_point_position(
850            './Program_pictures/attrcopyroot1.png',
851            'root')  # get root location
852        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
853        self.test.click_canvas_point(el, loc[0], loc[1])  # click root
854        self.test.canvas_paste()  # keyboard paste extstring
855        aftercopy = self.test.text_count(
856            './Program_pictures/attrcopyroot2.png', 'string')
857        assert aftercopy == 2
858
859    def test_attrcancelcopy(self):
860        self.test.click_canvas_by_text(
861            'extstring')  # click extstring attr node
862        self.test.canvas_copy()  # key copy node
863        loc = self.test.get_obtain_point_position(
864            './Program_pictures/attrcancelcopy1.png',
865            '取消复制')  # get cancel copy location
866        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
867        self.test.click_canvas_point(el, loc[0], loc[1])  # click cancl copy
868        self.test.canvas_paste()  # key paste node
869        aftercopy = self.test.text_count(
870            './Program_pictures/attrcancelcopy2.png', 'string')
871        assert aftercopy == 1
872        flag = self.test.kuang_contain_text(
873            './Program_pictures/attrcancelcopy3.png', '重名')
874        assert flag is False
875        copyself = self.test.kuang_contain_text(
876            './Program_pictures/attrcancelcopy4.png', '己复制')
877        assert copyself is False
878        cancelcopy = self.test.kuang_contain_text(
879            './Program_pictures/attrcancelcopy5.png', '取消复制')
880        assert cancelcopy is False
881
882    def test_nodecopynode(self):
883        self.test.click_canvas_by_text('nodebb')  # click nodebb
884        self.test.canvas_copy()  # keyboard copy node
885        loc = self.test.get_canvas_point_position(
886            './Program_pictures/nodecopynode1.png',
887            'nodeaa')  # get nodeaa location
888        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
889        self.test.click_canvas_point(el, loc[0], loc[1])  # click nodeaa
890        self.test.canvas_paste()  # keyboar paste node
891        aftercopy = self.test.text_count(
892            './Program_pictures/nodecopynode2.png', 'nodebb')
893        assert aftercopy >= 2
894        flag = self.test.kuang_contain_text(
895            './Program_pictures/nodecopynode3.png', '重名')
896        assert flag is False
897
898    def test_nodecopyattr(self):
899        self.test.click_canvas_by_text('nodebb')  # click nodebb
900        self.test.canvas_copy()  # keyboard copy node
901        loc = self.test.get_obtain_point_position(
902            './Program_pictures/nodecopyattr1.png',
903            'extstring')  # get extstring location
904        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
905        self.test.click_canvas_point(el, loc[0],
906                                     loc[1])  # click extstring attr node
907        self.test.canvas_paste()  # keyboard paste node
908        aftercopy = self.test.text_count(
909            './Program_pictures/nodecopyattr2.png', 'nodebb')
910        assert aftercopy == 2
911
912    def test_nodecopynextattr(self):
913        self.test.click_canvas_by_text('nodebb')  # click nodebb
914        self.test.canvas_copy()  # keyboard copy nodebb
915        loc = self.test.get_obtain_point_position(
916            './Program_pictures/nodecopynextattr1.png',
917            'childatt')  # get childatt location
918        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
919        self.test.click_canvas_point(el, loc[0], loc[1])  # click childatt
920        self.test.canvas_paste()  # keyboard paste nodebb
921        aftercopy = self.test.text_count(
922            './Program_pictures/nodecopynextattr2.png', 'nodebb')
923        assert aftercopy >= 2
924        flag = self.test.kuang_contain_text(
925            './Program_pictures/nodecopynextattr3.png', '重名')
926        assert flag is False
927
928    def test_nodecopynextnode(self):
929        self.test.click_canvas_by_text('nodebb')  # click nodebb
930        self.test.canvas_copy()  # keyboard copy node
931        loc = self.test.get_obtain_point_position(
932            './Program_pictures/nodecopynextnode1.png',
933            'childnode')  # get childnode location
934        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
935        self.test.click_canvas_point(el, loc[0], loc[1])  # click childnode
936        self.test.canvas_paste()  # keyboard paste nodebb
937        aftercopy = self.test.text_count(
938            './Program_pictures/nodecopynextnode2.png', 'nodebb')
939        assert aftercopy >= 2
940        flag = self.test.kuang_contain_text(
941            './Program_pictures/nodecopynextnode3.png', '重名')
942        assert flag is False
943
944    def test_nodecopyroot(self):
945        self.test.click_canvas_by_text('nodebb')  # click nodebb
946        self.test.canvas_copy()  # keyboard copy node
947        loc = self.test.get_obtain_point_position(
948            './Program_pictures/nodecopyroot1.png', 'oot')  # get root location
949        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
950        self.test.click_canvas_point(el, loc[0], loc[1])  # click root
951        self.test.canvas_paste()  # keyboard paste nodebb
952        aftercopy = self.test.text_count(
953            './Program_pictures/nodecopyroot2.png', 'nodebb')
954        assert aftercopy >= 2
955
956    def test_nodecopyself(self):
957        loc = self.test.get_canvas_point_position(
958            './Program_pictures/nodecopyself1.png',
959            'nodebb')  # get nodebb location
960        el = self.test.find_element(('id', 'visual_area'))  # get canvas element
961        self.test.click_canvas_point(el, loc[0], loc[1])  # click nodebb
962        self.test.canvas_copy()  # keyboard copy nodebb
963        time.sleep(1)
964        copyself = self.test.text_count('./Program_pictures/nodecopyself2.png',
965                                        '已复制')
966        assert copyself == 1
967        cancelcopy = self.test.kuang_contain_text(
968            './Program_pictures/nodecopyself3.png', '取消复制')
969        assert cancelcopy is True
970        beforecopy = self.test.text_count(
971            './Program_pictures/nodecopyself4.png', 'nodebb')
972        self.test.canvas_paste()  # keyboar paste nodebb
973        time.sleep(2)
974        aftercopy = self.test.text_count(
975            './Program_pictures/nodecopyself5.png', 'nodebb')
976        assert aftercopy == beforecopy + 1  # Verify that nodebb is added to the drawing box
977        repeatname = self.test.text_count(
978            './Program_pictures/nodecopyself6.png', '重名')
979        assert repeatname == 0
980        nodeaaloc = self.test.get_canvas_point_position(
981            './Program_pictures/nodecopyself7.png', 'nodeaa')
982        self.test.click_canvas_point(el, nodeaaloc[0],
983                                     nodeaaloc[1])  # click nodeaa
984        self.test.canvas_paste()  # paste nodebb onto nodeaa
985        aftercopyagain = self.test.text_count(
986            './Program_pictures/nodecopyself8.png', 'nodebb')
987        assert aftercopyagain >= aftercopy + 2  # check paste new nodebb
988