2
2
from .models import InputModel , OutputModel ,CommandInput , CommandOutput
3
3
from selenium import webdriver
4
4
from selenium .webdriver .chrome .options import Options
5
+ from selenium .webdriver .common .by import By
5
6
from pathlib import Path
7
+ from typing import List
8
+ import json
6
9
class SeleniumWebBrowserPiece (BasePiece ):
7
10
8
11
def piece_function (self , input_data : InputModel ):
@@ -13,23 +16,49 @@ def piece_function(self, input_data: InputModel):
13
16
options .add_argument ("--no-sandbox" )
14
17
15
18
self .logger .info ("Start chrome web driver." )
16
- driver = webdriver .Chrome (options = options )
19
+ self . driver = webdriver .Chrome (options = options )
17
20
21
+ outputs = self .run_commands (commands = input_data .commands )
22
+
23
+ self .driver .quit ()
24
+
25
+ return OutputModel (
26
+ outputs = outputs
27
+ )
28
+
29
+ def run_commands (self , commands : List [CommandInput ]) -> List [str ]:
18
30
results_path = Path (self .results_path )
19
31
20
- for cmd in input_data .commands :
32
+ outputs : List [str ] = []
33
+
34
+ for idx , cmd in enumerate (commands ):
35
+ result = ""
36
+
37
+ self .logger .info (f"commands[{ idx } ] - { cmd .name } " + (f": { cmd .value } " if cmd .value else "" ))
38
+
39
+ if cmd .name .value == "get" :
40
+ self .driver .get (cmd .value )
41
+
42
+ if cmd .name .value == "current_url" :
43
+ result = self .driver .current_url
44
+
21
45
if cmd .name .value == "save_screenshot" :
22
46
cmd .value = str (results_path / cmd .value )
23
- self .display_result = dict (file_type = "png" ,filepath = cmd .value )
24
-
25
- if cmd .name .value is None :
26
- getattr (driver , cmd .name )()
27
- else :
28
- getattr (driver , cmd .name )(cmd .value )
29
-
30
- driver .quit ()
47
+ self .driver .save_screenshot (cmd .value )
48
+ result = cmd .value
31
49
32
- return OutputModel (
33
- outputs = [dict (name = "out1" , result = "res1" )]
34
- )
35
-
50
+ if cmd .name .value == "find_element_css" :
51
+ result = self .driver .find_element (By .CSS_SELECTOR , cmd .value ).text
52
+
53
+ if cmd .name .value == "find_elements_css" :
54
+ elements = self .driver .find_elements (By .CSS_SELECTOR , cmd .value )
55
+ result = []
56
+ for e in elements :
57
+ result .append (e .get_attribute ('innerHTML' ))
58
+
59
+ if not isinstance (result ,str ):
60
+ result = str (result )
61
+
62
+ outputs .append (result )
63
+
64
+ return outputs
0 commit comments