DAFAM-oto/login.py
2024-08-10 15:27:15 +02:00

306 lines
7.7 KiB
Python

""" This page created by Bedir Karaabali 04.08.2024
it's contain trustpilot and outlook.de login process. """
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException
from logger import setup_logger
import time, re, logging
setup_logger()
logging.getLogger(__file__)
def find_clickable_content(func):
def wrapper(self, *args, **kwargs):
_driver = args[0]
_timeout = args[1]
_finder = args[3]
se_list = {
'0':By.ID,
'1':By.NAME,
'2':By.CSS_SELECTOR,
'3':By.CLASS_NAME
}
_selector = se_list[f'{args[2]}']
_req = (_selector, _finder)
logging.info("find_clickable_content basladi")
try:
_find_item = WebDriverWait(_driver, timeout=_timeout).until(
EC.element_to_be_clickable((_req))
)
_find_item.click()
except TimeoutException as t:
logging.error(f"time out {t} \n\n")
except NoSuchElementException as e:
logging.error(f"no element find {e}")
return func(self, *args, **kwargs)
return wrapper
def find_fillable_content(func):
def wrapper(self, *args, **kwargs):
_driver = args[0]
_timeout = args[1]
_finder = args[3]
se_list = {
'0':By.ID,
'1':By.NAME,
'2':By.CSS_SELECTOR,
'3':By.CLASS_NAME
}
_selector = se_list[f'{args[2]}']
_req = (_selector, _finder)
logging.info("find_fillable_content basladi")
try:
_find_item = WebDriverWait(_driver, timeout=_timeout).until(
EC.presence_of_element_located((_req))
)
for key, value in kwargs.items():
if value != None or value != '':
if hasattr(_find_item, 'send_keys'):
_find_item.send_keys(value)
else:
logging.error(f"{key} wrong process.")
except TimeoutException as t:
print(f"time out {t} \n\n")
logging.error(f"time out {_finder}")
except NoSuchElementException as e:
logging.error(f"no element find {e}")
return func(self, *args, **kwargs)
return wrapper
def get_knowledge(func):
def wrapper(self, *args, **kwargs):
_driver = args[0]
_timeout = args[1]
_finder = args[3]
se_list = {
'0':By.ID,
'1':By.NAME,
'2':By.CSS_SELECTOR,
'3':By.CLASS_NAME
}
_selector = se_list[f'{args[2]}']
_req = (_selector, _finder)
logging.info("get_knowledge basladi")
try:
_find_item = WebDriverWait(_driver, timeout=_timeout).until(
EC.presence_of_element_located((_req))
)
return _find_item.text
except TimeoutException as t:
logging.error(f"time out {t} \n\n")
except NoSuchElementException as e:
logging.error(f"element bulunamadi {_finder}")
return func(self, *args, **kwargs)
return wrapper
class TrustPilot:
def __init__(self, _main_link, _browser_type, _proxy:str) -> None:
self.current_page = 0
self.result = ''
self.proxy = _proxy
self.selectors = {
'id':0,
'name':1,
'css':2,
'class':3
}
self.pages = {}
self._link = _main_link
self._browser_type = _browser_type
self._web_driver = None
self._cookie_menagement = None
self.chrome_options = None
self.preprocess()
self.request_web_main_page(_main_link)
self.cookies_control()
self.pages_update()
def set_settings(self):
self.chrome_options = webdriver.ChromeOptions()
self.chrome_options.add_argument(f'--proxy-server={self.proxy}')
logging.info("proxy ayarlandi")
def extract_numbers(self, text):
numbers = re.findall(r'\d', text)
logging.info(f"onay sifresi elde edildi {numbers}")
return ''.join(numbers)
def pages_update(self):
pages = self._web_driver.window_handles
self.pages = {index: value for index, value in enumerate(pages)}
logging.info("sayfa degisti")
def preprocess(self):
self._web_driver = webdriver.Chrome(options=self.chrome_options) if self._browser_type == "chrome" else webdriver.Firefox() #now just 2 browser Google Chrome and FireFox
def request_web_main_page(self, link):
try:
self._web_driver.get(link)
time.sleep(.5)
except WebDriverException as w:
logging.error(f"Failed to get the page: {link}. Exception: {w}")
@find_clickable_content
def pass_cookie(self, driver, timeout, by, value):
pass
def cookies_control(self):
self._cookie_menagement = self._web_driver.get_cookies()
if self._cookie_menagement:
self.pass_cookie(self._web_driver, 10, self.selectors['id'], "onetrust-accept-btn-handler")
@find_clickable_content
def _find_and_click(self, driver, timeout, by, value):
pass
def find_and_click(self, timeout=10, by=None, value=None):
self._find_and_click(self._web_driver, timeout, self.selectors[f'{by}'], value)
@find_fillable_content
def _find_and_fill(self, driver, timeout, by, value, **kwargs):
pass
def find_and_fill(self, timeout=10, by=None, value=None, text='None', command=None):
if command != None: self._find_and_fill(self._web_driver,timeout, self.selectors[f'{by}'], value, text=text, command=command)
else :self._find_and_fill(self._web_driver,timeout, self.selectors[f'{by}'], value, text=text)
def add_page(self, link):
self._web_driver.execute_script(f"window.open('{link}');")
self.pages_update()
def pages_to(self, page_num):
self.current_page = page_num
self._web_driver.switch_to.window(f'{self._web_driver.window_handles[page_num]}')
def home(self):
self.pages_to(0)
self.current_page = 0
def active_element_click(self):
active_element = self._web_driver.execute_script("return document.activeElement;")
time.sleep(.9)
active_element.send_keys(Keys.ENTER)
@get_knowledge
def _get_knowledge(self, driver, timeout, by, value, **kwargs):
pass
def get_knowledge(self, by, value):
text = self._get_knowledge(self._web_driver, 10, self.selectors[f'{by}'], value)
self.result = self.extract_numbers(text)
def end(self):
logging.info("quiting")
self._web_driver.quit()
"""
class find_and_fill(object):
def __init__ (self, selector, value):
self.selector = selector
self.value = value
def __call__(self, driver):
element = driver.find_element(*self.selector)
if self.value in element.get_attribute('id'):
return element
else: return False
link = "https://trustpilot.com/users/connect?redirect=%2F&source_cta=header"
if __name__ == "__main__":
driver = webdriver.Chrome()
driver.get(link)
element = WebDriverWait(driver, 10).until(
find_and_fill((By.ID, 'input'), 'input')
)
print(element)
"""