10
10
from selenium .webdriver .support import expected_conditions as EC
11
11
from selenium .webdriver .common .action_chains import ActionChains
12
12
13
-
14
13
from web_session import WebSession
15
14
16
15
reorder_list = [
71
70
72
71
class Cracker :
73
72
DELAY = 5
74
-
75
- def __init__ (self , executable_path = None ):
76
- options = webdriver .ChromeOptions ()
77
- options .add_argument ("--log-level=3" )
78
- options .add_argument ("--window-size=350,560" )
79
-
80
- self .driver = webdriver .Chrome (
81
- executable_path ,
82
- options = options )
73
+ CSS_SELECTOR_FULLBG_IMG = 'svg > defs > g[id=gt_fullbg_1] > g > image'
74
+ CSS_SELECTOR_BG_IMG = 'svg > defs > g[id = gt_bg_1] > g > image'
75
+ CSS_SELECTOR_GAP_IMG = 'a[target=_blank] > image'
76
+
77
+ def __init__ (self , executable_path = None , no_selenium = False ):
78
+ if no_selenium :
79
+ self .driver = None
80
+ else :
81
+ options = webdriver .ChromeOptions ()
82
+ options .add_argument ("--log-level=3" )
83
+ options .add_argument ("--window-size=350,560" )
84
+
85
+ self .driver = webdriver .Chrome (
86
+ executable_path ,
87
+ options = options )
83
88
self .session = WebSession ()
84
89
85
- @ staticmethod
86
- def __bytes2cvimg ( content : bytes ) -> np . ndarray :
90
+ def download_img ( self , img_url : str ) -> np . ndarray :
91
+ content = self . session . request_binary ( 'GET' , img_url )
87
92
arr = np .asarray (bytearray (content ), dtype = np .uint8 )
88
93
return cv2 .imdecode (arr , cv2 .IMREAD_UNCHANGED ) # 'Load it as it is'
89
94
90
95
@staticmethod
91
- def __reorder_img (unordered_img : np .ndarray ) -> np .ndarray :
96
+ def reorder_img (unordered_img : np .ndarray ) -> np .ndarray :
92
97
reordered_img = np .zeros ((unordered_img .shape [0 ], 260 , * unordered_img .shape [2 :]), np .uint8 )
93
98
x_upper = 0
94
99
x_lower = 0
@@ -106,33 +111,25 @@ def __reorder_img(unordered_img: np.ndarray) -> np.ndarray:
106
111
107
112
return reordered_img
108
113
109
- def __fetch_unordered_img (self , css_selector : str ) -> np .ndarray :
110
- element = self .driver .find_element_by_css_selector (css_selector )
111
- img_url = element .get_attribute ('href' )
112
- unordered_img = self .__bytes2cvimg (self .session .request_binary ('GET' , img_url ))
113
- # cv2.imshow('unordered_img', unordered_img)
114
-
115
- return unordered_img
116
-
117
114
def load_url (self , url = None ) -> int :
118
115
if url is not None :
119
116
self .driver .get (url )
120
117
try :
121
118
WebDriverWait (self .driver , self .DELAY ).until (
122
- EC .presence_of_element_located (
123
- (
124
- By .CSS_SELECTOR ,
125
- 'svg > defs > g[id=gt_fullbg_1] > g > image[href] , div[class=error-box] span[class]'
126
- )
127
- ),
119
+ EC .presence_of_element_located (
120
+ (
121
+ By .CSS_SELECTOR ,
122
+ f' { self . CSS_SELECTOR_FULLBG_IMG } , div[class=error-box] span[class]'
123
+ )
124
+ ),
128
125
)
129
- if not self .driver .find_elements_by_css_selector ('svg > defs > g[id=gt_fullbg_1] > g > image[href]' ):
126
+ if not self .driver .find_elements_by_css_selector (self . CSS_SELECTOR_FULLBG_IMG ):
130
127
print ("页面异常,即将自动重新刷新" )
131
128
return 1
132
129
133
130
WebDriverWait (self .driver , self .DELAY ).until (
134
131
EC .presence_of_element_located (
135
- (By .CSS_SELECTOR , 'svg > defs > g[id=gt_bg_1] > g > image[href]' )
132
+ (By .CSS_SELECTOR , self . CSS_SELECTOR_BG_IMG )
136
133
)
137
134
)
138
135
print ("页面正常加载完毕" )
@@ -145,12 +142,15 @@ def refresh(self):
145
142
self .driver .find_element_by_css_selector ('div[class=error-box] span[class]' ).click ()
146
143
147
144
def fetch_imgs (self ) -> Tuple [np .ndarray , np .ndarray , np .ndarray ]:
148
- unordered_fullbg_img = self .__fetch_unordered_img ("svg > defs > g[id=gt_fullbg_1] > g > image" )
149
- unordered_bg_img = self .__fetch_unordered_img ("svg > defs > g[id = gt_bg_1] > g > image" )
150
- gap_img = self .__fetch_unordered_img ("a[target=_blank] > image" )
145
+ unordered_fullbg_img = self .download_img (
146
+ self .driver .find_element_by_css_selector (self .CSS_SELECTOR_FULLBG_IMG ).get_attribute ('href' ))
147
+ unordered_bg_img = self .download_img (
148
+ self .driver .find_element_by_css_selector (self .CSS_SELECTOR_BG_IMG ).get_attribute ('href' ))
149
+ gap_img = self .download_img (
150
+ self .driver .find_element_by_css_selector (self .CSS_SELECTOR_GAP_IMG ).get_attribute ('href' ))
151
151
152
- reordered_fullbg_img = self .__reorder_img (unordered_fullbg_img )
153
- reordered_bg_img = self .__reorder_img (unordered_bg_img )
152
+ reordered_fullbg_img = self .reorder_img (unordered_fullbg_img )
153
+ reordered_bg_img = self .reorder_img (unordered_bg_img )
154
154
155
155
# cv2.imshow('reordered_fullbg_img', reordered_fullbg_img)
156
156
# cv2.imshow('reordered_bg_img', reordered_bg_img)
@@ -179,22 +179,22 @@ def slide_slider(self, track, ratio):
179
179
ActionChains (self .driver ).click_and_hold (element ).perform ()
180
180
assert (track [1 ][0 ], track [1 ][1 ], track [1 ][2 ]) == (0 , 0 , 0 )
181
181
182
- real_track = [(int (x * ratio ), y ) for x , y , _ in track ]
182
+ real_track = [(int (x * ratio ), y ) for x , y , _ in track ]
183
183
184
184
actions = ActionChains (self .driver )
185
185
for i in range (2 , len (real_track ), 1 ):
186
186
actions .move_by_offset (
187
- xoffset = (real_track [i ][0 ]- real_track [i - 1 ][0 ]),
188
- yoffset = (real_track [i ][1 ]- real_track [i - 1 ][1 ]))
187
+ xoffset = (real_track [i ][0 ] - real_track [i - 1 ][0 ]),
188
+ yoffset = (real_track [i ][1 ] - real_track [i - 1 ][1 ]))
189
189
actions .perform ()
190
190
time .sleep (0.6 )
191
191
ActionChains (self .driver ).release ().perform ()
192
192
193
193
def test_slide_slider (self , distance , ratio ):
194
194
element = self .driver .find_element_by_css_selector ('svg > g > g[transform][style]' )
195
195
ActionChains (self .driver ).click_and_hold (element ).perform ()
196
- ActionChains (self .driver ).\
197
- move_by_offset (xoffset = (distance * ratio ), yoffset = 0 ).\
196
+ ActionChains (self .driver ). \
197
+ move_by_offset (xoffset = (distance * ratio ), yoffset = 0 ). \
198
198
perform ()
199
199
time .sleep (1.0 )
200
200
ActionChains (self .driver ).release ().perform ()
0 commit comments