-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdriverManager.py
More file actions
257 lines (207 loc) · 7.6 KB
/
Copy pathdriverManager.py
File metadata and controls
257 lines (207 loc) · 7.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
"""
WebDriver Yönetim Modülü
Bu modül Chrome WebDriver'ın başlatılması, ayarlanması ve yönetiminden sorumludur.
Orijinal kodun 18-43. ve 497. satırlarından alınmıştır.
"""
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import WebDriverException
import logging
# Kendi modülümüzden config'leri import et
from config import (
DEFAULT_CHROMEDRIVER_PATH,
CHROME_OPTIONS,
CHROME_EXPERIMENTAL_OPTIONS,
ANTI_DETECTION_SCRIPT,
setup_logging
)
class DriverManager:
"""
WebDriver yönetiminden sorumlu sınıf
Orijinal GoogleMapsScraper.__init__ ve setup_driver metodlarından
yeniden düzenlenmiştir (satır 18-43)
"""
def __init__(self, chromedriver_path=None):
"""
Driver Manager'ı başlat
Args:
chromedriver_path (str): ChromeDriver'ın path'i
(Orijinal kodun 23. satırından)
"""
self.logger = setup_logging()
self.driver = None
self.chromedriver_path = chromedriver_path or DEFAULT_CHROMEDRIVER_PATH
# Driver'ı otomatik olarak başlat
self.setup_driver()
def setup_driver(self):
"""
Chrome driver'ı ayarla ve başlat
Orijinal kodun 25-43. satırlarından birebir alınmıştır.
Tek fark: config.py'dan ayarları çekiyor
"""
try:
# Chrome seçeneklerini ayarla (Orijinal 29-35. satırlar)
options = self._configure_chrome_options()
# Chrome service'i ayarla (Orijinal 37. satır)
service = Service(self.chromedriver_path)
# Driver'ı başlat (Orijinal 39. satır)
self.driver = webdriver.Chrome(service=service, options=options)
# Anti-detection script çalıştır (Orijinal 40. satır)
self.driver.execute_script(ANTI_DETECTION_SCRIPT)
self.logger.info("Chrome driver başarıyla başlatıldı")
return True
except WebDriverException as e:
self.logger.error(f"Driver başlatma hatası: {e}")
raise
except Exception as e:
self.logger.error(f"Beklenmeyen driver hatası: {e}")
raise
def _configure_chrome_options(self):
"""
Chrome seçeneklerini yapılandır
Orijinal kodun 29-35. satırlarını config.py kullanarak yeniden yazdık
"""
options = Options()
# Temel seçenekleri ekle (config.py'dan)
for option in CHROME_OPTIONS:
options.add_argument(option)
# Experimental seçenekleri ekle (config.py'dan)
for key, value in CHROME_EXPERIMENTAL_OPTIONS.items():
options.add_experimental_option(key, value)
self.logger.debug(f"Chrome options yapılandırıldı: {len(CHROME_OPTIONS)} temel, {len(CHROME_EXPERIMENTAL_OPTIONS)} experimental")
return options
def get_driver(self):
"""
Driver instance'ını döndür
Returns:
webdriver.Chrome: Yapılandırılmış Chrome driver
"""
if not self.driver:
self.logger.error("Driver henüz başlatılmamış!")
raise RuntimeError("Driver not initialized")
return self.driver
def is_driver_alive(self):
"""
Driver'ın çalışır durumda olup olmadığını kontrol et
Returns:
bool: Driver çalışıyorsa True
"""
try:
if self.driver:
# Driver'ın title'ını almaya çalış (basit bir test)
_ = self.driver.title
return True
except Exception:
return False
return False
def restart_driver(self):
"""
Driver'ı yeniden başlat
Hata durumlarında kullanılabilir
"""
self.logger.info("Driver yeniden başlatılıyor...")
# Önce mevcut driver'ı kapat
self.close()
# Yeniden başlat
self.setup_driver()
self.logger.info("Driver başarıyla yeniden başlatıldı")
def maximize_window(self):
"""
Browser penceresini maksimize et
"""
if self.driver:
self.driver.maximize_window()
self.logger.debug("Browser penceresi maksimize edildi")
def set_window_size(self, width, height):
"""
Browser pencere boyutunu ayarla
Args:
width (int): Genişlik
height (int): Yükseklik
"""
if self.driver:
self.driver.set_window_size(width, height)
self.logger.debug(f"Browser pencere boyutu ayarlandı: {width}x{height}")
def get_driver_info(self):
"""
Driver hakkında bilgi döndür
Returns:
dict: Driver bilgileri
"""
if not self.driver:
return {"status": "not_initialized"}
try:
return {
"status": "active",
"current_url": self.driver.current_url,
"title": self.driver.title,
"window_size": self.driver.get_window_size(),
"session_id": self.driver.session_id
}
except Exception as e:
return {
"status": "error",
"error": str(e)
}
def close(self):
"""
Driver'ı güvenli şekilde kapat
Orijinal kodun 497. satırından birebir alınmıştır
"""
if self.driver:
try:
self.driver.quit()
self.logger.info("Driver kapatıldı")
except Exception as e:
self.logger.warning(f"Driver kapatma hatası: {e}")
finally:
self.driver = None
def __enter__(self):
"""
Context manager desteği - 'with' statement ile kullanım için
"""
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""
Context manager desteği - otomatik kapatma
"""
self.close()
def __del__(self):
"""
Destructor - Garbage collection sırasında otomatik kapatma
"""
self.close()
# ============================================================================
# UTILITY FUNCTIONS
# ============================================================================
def create_driver_manager(chromedriver_path=None):
"""
Driver Manager oluştur (Factory function)
Args:
chromedriver_path (str, optional): ChromeDriver path'i
Returns:
DriverManager: Yapılandırılmış driver manager
"""
return DriverManager(chromedriver_path=chromedriver_path)
def test_driver_setup():
"""
Driver setup'ını test et
Returns:
bool: Test başarılıysa True
"""
try:
with create_driver_manager() as manager:
driver = manager.get_driver()
driver.get("https://www.google.com")
return True
except Exception as e:
print(f"Driver test hatası: {e}")
return False
# Test için main block
if __name__ == "__main__":
print("Driver Manager Test başlatılıyor...")
if test_driver_setup():
print("✅ Driver Manager başarıyla çalışıyor!")
else:
print("❌ Driver Manager testinde hata oluştu!")