Best Python code snippet using pom_python
jobcan.py
Source:jobcan.py
1# coding: utf-82from selenium import webdriver3from selenium.webdriver.support.ui import Select4from selenium.common.exceptions import NoSuchElementException5from selenium.webdriver.common.keys import Keys6import time7import datetime8# utility9def checkbox_setvalue(checkbox, value, toggle='click'):10 value = bool(value)11 if checkbox.is_selected() == value:12 return False13 if toggle.lower() == 'click':14 checkbox.click()15 elif toggle.lower() == 'enter':16 checkbox.send_keys(Keys.ENTER)17 elif toggle.lower() == 'space':18 checkbox.send_keys(Keys.SPACE)19# Main classes20class Jobcan:21 def __init__(self, user_email=None, user_password=None, chromedriver_path=None):22 if (user_email and user_password) is None:23 with open('./setting') as f:24 user_email = user_email or f.readline().strip()25 user_password = user_password or f.readline().strip()26 chromedriver_path = chromedriver_path or f.readline().strip() or 'chromedriver'27 self.user_email = user_email28 self.user_password = user_password29 self.chromedriver_path = chromedriver_path30 if self.chromedriver_path is not None:31 self.driver = webdriver.Chrome(self.chromedriver_path)32 else:33 self.driver = webdriver.Chrome()34 self.login()35 @staticmethod36 def setting_file(filepath):37 with open(filepath) as f:38 user_email = f.readline().strip()39 user_password = f.readline().strip()40 chromedriver_path = f.readline().strip() or 'chromedriver'41 return Jobcan(user_email, user_password, chromedriver_path)42 def login(self):43 self.driver.get('https://id.jobcan.jp/users/sign_in')44 email = self.driver.find_element_by_id('user_email')45 email.clear()46 email.send_keys(self.user_email)47 password = self.driver.find_element_by_id('user_password')48 password.clear()49 password.send_keys(self.user_password)50 self.driver.find_element_by_name('commit').click()51 self.driver.get('https://ssl.jobcan.jp/jbcoauth/login')52 def close(self):53 if self.driver is not None:54 self.driver.close()55 def move(self, dst):56 if self.driver.current_url == dst:57 return58 else:59 self.driver.get(dst)60 time.sleep(1)61 if self.driver.current_url.startswith('https://id.jobcan.jp/users/sign_in'): # ãªãã°62 self.login()63 self.driver.get(dst)64 time.sleep(1)65 return66 def start_job(self, adit_group_text=None, yakin=False):67 """68 å¤åéå§ã®æå»ããã¾ãã69 æªåºå¤/éå®¤ä¸ ã®ã¨ã, å
¥å®¤70 å¤åä¸ã®ã¨ã, 71 æå»å ´æã¨å¤åå ´æãç°ãªãå ´å, 移å72 æå»å ´æã¨å¤åå ´æãåä¸ã®å ´å, ä½ãããªã73 æå»å ´æãæå®ããªãå ´å, ä½ãããªã74 return: (æå»:'hh:mm', jobcanã«æå»ãããï¼:True/False)75 """76 status = False77 if not adit_group_text is None:78 adit_group_text = str(adit_group_text)79 if yakin:80 status = self.get_status_table('yesterday')81 else:82 status = self.get_status_table()83 self.move('https://ssl.jobcan.jp/employee')84 checkbox_setvalue(self.driver.find_element_by_id('is_yakin'), yakin)85 # å ´æã®é¸æ86 if adit_group_text is not None:87 if self.driver.find_element_by_id('working_status').text == 'å¤åä¸': # å¤åä¸: å¤åå ´æå¤æ´ãä½ãããªã88 if status and status[-1]['æå»å ´æ'] == adit_group_text:89 print('æ¢ã«åä¸å°ç¹ã§å¤åä¸ã§ã')90 return self.get_time(), False91 else:92 print('å¤åå ´æãå¤æ´ãã¾ã')93 else:94 print('å¤åéå§ãã¾ã')95 Select(self.driver.find_element_by_css_selector('#adit_group_id')).select_by_visible_text(adit_group_text)96 else:97 if self.driver.find_element_by_id('working_status').text == 'å¤åä¸': # å¤åä¸: ä½ãããªã98 print('å¤åä¸ã§ã')99 return self.get_time(), False100 else:101 print('å¤åãéå§ãã¾ã')102 # æå»ã®åå¾103 # t = self.get_time()104 # åºå¤105 self.driver.find_element_by_id('adit-button-push').click()106 time.sleep(5)107 t = self.get_status_table()[-1]['æå»']108 return t, True109 def end_job(self, yakin=False):110 """111 å¤åçµäºã®æå»ããã¾ãã112 æªåºå¤/éå®¤ä¸ ã®ã¨ã, ä½ãããªã113 å¤åä¸ã®ã¨ã, å¤åå ´æã§æå»ãã, é室114 return: (æå»:'hh:mm', jobcanã«æå»ãããï¼:True/False)115 """116 if yakin:117 status = self.get_status_table('yesterday')118 else:119 status = self.get_status_table()120 self.move('https://ssl.jobcan.jp/employee')121 checkbox_setvalue(self.driver.find_element_by_id('is_yakin'), yakin)122 if status:123 adit_group_text = status[-1]['æå»å ´æ']124 Select(self.driver.find_element_by_css_selector('#adit_group_id')).select_by_visible_text(adit_group_text)125 if self.driver.find_element_by_id('working_status').text != 'å¤åä¸':126 print('å¤åä¸ã§ã¯ããã¾ãã')127 return self.get_time(), False128 #t = self.get_time()129 self.driver.find_element_by_id('adit-button-push').click()130 time.sleep(5)131 t = self.get_status_table()[-1]['æå»']132 return t, True133 def get_time(self):134 prev = self.driver.current_url135 self.move('https://ssl.jobcan.jp/employee')136 for i in range(10):137 t = self.driver.find_element_by_id('clock').text.split(':')138 if len(t) == 3:139 h, m, s = map(int, t)140 if (h, m, s) != (0, 0, 0):141 s -= i142 m += (s // 60)143 h += (m // 60)144 return '{:0>2}:{:0>2}'.format(h, m)145 time.sleep(1)146 raise AssertionError147 def get_status_table(self, day='today', fmt='%Y/%m/%d'):148 day = day.lower()149 self.move('https://ssl.jobcan.jp/employee/adit/modify/')150 if day=='today':151 pass152 else:153 if day=='yesterday':154 iyear = int(Select(self.driver.find_element_by_name('year')).first_selected_option.text)155 imonth = int(Select(self.driver.find_element_by_name('month')).first_selected_option.text)156 iday = int(Select(self.driver.find_element_by_name('day')).first_selected_option.text)157 date = datetime.date(iyear, imonth, iday) - datetime.timedelta(days=1)158 else:159 date = datetime.datetime.strptime(day, fmt).date()160 # set date161 self.move('https://ssl.jobcan.jp/employee/adit/modify?year={}&month={}&day={}'.format(date.year, date.month, date.day))162 try:163 rows = len(self.driver.find_element_by_xpath('//*[@id="logs-table"]/div/table/tbody').find_elements_by_tag_name('tr'))164 except NoSuchElementException:165 return []166 ret = []167 for i in range(1, rows):168 row_xpath = '//*[@id="logs-table"]/div/table/tbody/tr[{}]/'.format(i+1)169 d = {}170 d['æå»åºå'] = self.driver.find_element_by_xpath(row_xpath + ' td[1]').text171 d['æå»'] = self.driver.find_element_by_xpath(row_xpath + 'td[2]').text172 d['æå»æ¹æ³'] = self.driver.find_element_by_xpath(row_xpath + 'td[3]').text173 d['æå»å ´æ'] = self.driver.find_element_by_xpath(row_xpath + 'td[4]').text174 d['æå»åèç'] = self.driver.find_element_by_id('edit-reason-{}_text'.format(i)).text175 ret.append(d)176 return ret177 def get_adit_group(self):178 self.move('https://ssl.jobcan.jp/employee')179 return [s.text for s in Select(self.driver.find_element_by_css_selector('#adit_group_id')).options]180 def __del__(self):181 self.close()182 # å·¥æ°ç®¡ç183 def _mh_set_year_month(self, year, month):184 year = str(year)185 s = Select(self.driver.find_element_by_name('year'))186 if not s.first_selected_option.text == year:187 s.select_by_visible_text(year)188 month = str(month)189 if len(month) == 1:190 month = '0' + month191 s = Select(self.driver.find_element_by_name('month'))192 def _mh_open_daily_window(self, year, month, day):193 self._mh_set_year_month(year, month)194 self.driver.find_element_by_xpath(195 '//*[@id="search-result"]/table/tbody/tr[{}]/td[4]/div'.format(int(day))).click()196 time.sleep(5)197 def _mh_daily_close_window(self):198 self.driver.find_element_by_id('menu-close').send_keys(Keys.ENTER)199 def _mh_daily_save_close_window(self):200 self.driver.find_element_by_id('save').send_keys(Keys.ENTER)201 def _mh_daily_get_report(self): # daily-windowãéããç¶æ
ã§å¼ã¶ã¡ã½ãã202 rows = len(self.driver.find_element_by_xpath('//*[@id="edit-menu-contents"]/table/tbody').find_elements_by_tag_name('tr'))203 ret = []204 for i in range(2, rows+1):205 row_xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/'.format(i)206 d = {}207 d['ããã¸ã§ã¯ã'] = Select(self.driver.find_element_by_xpath(row_xpath + 'td[2]/select')).first_selected_option.text208 d['ã¿ã¹ã¯'] = Select(self.driver.find_element_by_xpath(row_xpath + 'td[3]/select')).first_selected_option.text209 d['å·¥æ°'] = self.driver.find_element_by_xpath(row_xpath + 'td[4]/input[1]').get_attribute('value')210 ret.append(d)211 return ret212 def _mh_daily_append_record_tail(self, project_name, task_name, worktime_hour, worktime_minute):213 rows = len(self.driver.find_element_by_xpath(214 '//*[@id="edit-menu-contents"]/table/tbody').find_elements_by_tag_name('tr'))215 if rows == 1:216 xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[1]/td[5]/span'217 else:218 xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/td[5]/span[1]'.format(rows)219 self.driver.find_element_by_xpath(xpath).click()220 row_xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/'.format(rows + 1)221 Select(self.driver.find_element_by_xpath(row_xpath + 'td[2]/select')).select_by_visible_text(project_name)222 Select(self.driver.find_element_by_xpath(row_xpath + 'td[3]/select')).select_by_visible_text(task_name)223 worktime_minute += worktime_hour * 60224 worktime_hour = worktime_minute // 60225 worktime_min = worktime_minute % 60226 self.driver.find_element_by_xpath(row_xpath + 'td[4]/input[1]').send_keys('{}:{}'.format(worktime_hour, worktime_min))227 def _mh_daily_add_record(self, project_name, task_name, worktime_hour, worktime_minute): # æé追å ç¨ã¡ã½ãã228 rows = len(self.driver.find_element_by_xpath(229 '//*[@id="edit-menu-contents"]/table/tbody').find_elements_by_tag_name('tr'))230 for i in range(2, rows+1):231 row_xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/'.format(i)232 if Select(self.driver.find_element_by_xpath(row_xpath + 'td[2]/select')).first_selected_option.text== project_name:233 if Select(self.driver.find_element_by_xpath(row_xpath + 'td[3]/select')).first_selected_option.text== task_name:234 input_ = self.driver.find_element_by_xpath(row_xpath + 'td[4]/input[1]')235 hour, min = input_.get_attribute('value').split(':')236 minutes = int(min) + 60 * int(hour) + worktime_minute + int(60 * worktime_hour)237 input_.clear()238 input_.send_keys('{}:{}'.format(minutes//60, minutes%60))239 return240 self._mh_daily_append_record_tail(project_name, task_name, worktime_hour, worktime_minute)241 def _mh_daily_write_record(self, project_name, task_name, worktime_hour, worktime_minute): # ä¸æ¸ãç¨ã¡ã½ãã242 rows = len(self.driver.find_element_by_xpath(243 '//*[@id="edit-menu-contents"]/table/tbody').find_elements_by_tag_name('tr'))244 for i in range(2, rows+1):245 row_xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/'.format(i)246 if Select(self.driver.find_element_by_xpath(row_xpath + 'td[2]/select')).first_selected_option.text== project_name:247 if Select(self.driver.find_element_by_xpath(row_xpath + 'td[3]/select')).first_selected_option.text== task_name:248 input_ = self.driver.find_element_by_xpath(row_xpath + 'td[4]/input[1]')249 minutes = worktime_minute + int(60 * worktime_hour)250 input_.clear()251 input_.send_keys('{}:{}'.format(minutes//60, minutes%60))252 return253 self._mh_daily_append_record_tail(project_name, task_name, worktime_hour, worktime_minute)254 def add_man_hour(self, project_name, task_name, year, month, day, worktime_hour, worktime_minute):255 self.move('https://ssl.jobcan.jp/employee/man-hour-manage')256 self._mh_open_daily_window(year, month, day)257 self._mh_daily_add_record(project_name, task_name, worktime_hour, worktime_minute)258 self._mh_daily_save_close_window()259 def get_man_hour(self, year, month, day):260 self.move('https://ssl.jobcan.jp/employee/man-hour-manage')261 self._mh_open_daily_window(year, month, day)262 ret = self._mh_daily_get_report()263 self._mh_daily_close_window()264 return ret265 def get_projects_and_tasks(self):266 date = datetime.date.today()267 self.move('https://ssl.jobcan.jp/employee/man-hour-manage')268 self._mh_open_daily_window(date.year, date.month, date.day)269 rows = len(self.driver.find_element_by_xpath(270 '//*[@id="edit-menu-contents"]/table/tbody').find_elements_by_tag_name('tr'))271 if rows == 1:272 xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[1]/td[5]/span'273 else:274 xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/td[5]/span[1]'.format(rows)275 self.driver.find_element_by_xpath(xpath).click()276 row_xpath = '//*[@id="edit-menu-contents"]/table/tbody/tr[{}]/'.format(rows + 1)277 projects = [s.text for s in Select(self.driver.find_element_by_xpath(row_xpath + 'td[2]/select')).options]278 ret = {}279 for project in projects:280 Select(self.driver.find_element_by_xpath(row_xpath + 'td[2]/select')).select_by_visible_text(project)281 tasks = tuple(s.text for s in Select(self.driver.find_element_by_xpath(row_xpath + 'td[3]/select')).options)282 ret[project] = tasks283 self._mh_daily_close_window()...
onvista.py
Source:onvista.py
1import lxml.html2import re3from decimal import Decimal4from stockanalyser.mymoney import Money5import logging6from stockanalyser.data_source import common7logger = logging.getLogger(__name__)8class ParsingError(Exception):9 pass10def is_number(txt):11 try:12 float(txt)13 return True14 except (ValueError, TypeError):15 return False16class OnvistaScraper(object):17 def __init__(self, url):18 self.overview_url = url19 self.fundamental_url = self._build_fundamental_url(url)20 self.fundamental_etree = None21 self.fetch_fundamental_webpage()22 self.fetch_overview_webpage()23 def _build_fundamental_url(self, url):24 spl = url.split("/")25 spl.insert(4, "fundamental")26 return "/".join(spl)27 def fetch_fundamental_webpage(self):28 self.fundamental_etree = common.url_to_etree(self.fundamental_url)29 def fetch_overview_webpage(self):30 self.overview_etree = common.url_to_etree(self.overview_url)31 def _get_analyst_rating(self, xpath):32 res = self.overview_etree.xpath(xpath)33 if not res:34 return None35 v = int(res[0].strip())36 return v37 def analyst_ratings(self):38 buy_xpath = ('.//*[@id="AggregatedAnalysesTabAction"]/div/article/'39 'div/table/tbody/tr[1]/td[2]/text()')40 hold_xpath = ('.//*[@id="AggregatedAnalysesTabAction"]/div/article/'41 'div/table/tbody/tr[2]/td[2]/text()')42 sell_xpath = ('.//*[@id="AggregatedAnalysesTabAction"]/div/article/'43 'div/table/tbody/tr[3]/td[2]/text()')44 buy = self._get_analyst_rating(buy_xpath)45 hold = self._get_analyst_rating(hold_xpath)46 sell = self._get_analyst_rating(sell_xpath)47 return (buy, hold, sell)48 def _get_table_header(self, header):49 # onvista uses 2 different presentation for the year:50 # "18/19e 17/18e 16/17e 15/16" and51 # "2019e 2018e 2017e 2016e"52 theader = []53 for r in header:54 v = r.text.lower().strip()55 if not len(v):56 continue57 # handle presentation of years as58 # "18/19e 17/18e 16/17e 15/16", convert them to the59 # YYYY (eg 2018) format60 if "/" in v:61 v = "20" + v.split("/")[1]62 # remove the "e" for estimated from year endings63 if re.match("\d+e", v):64 v = int(v[:-1])65 elif is_number(v):66 v = int(v)67 theader.append(v)68 return theader69 def _normalize_number(self, string):70 v = string.lower().strip()71 if v == "-":72 return None73 # replace german decimal seperator "," with "."74 v = v.replace(",", ".")75 v = v.replace("%", "")76 return v77 def _extract_from_table(self, table_xpath, table_header, row_xpath,78 row_header, is_money=False):79 res = self.fundamental_etree.findall(table_xpath)80 theader = self._get_table_header(res)81 if theader[0] != table_header:82 raise ParsingError("Unexpected table header: '%s'" % theader[0])83 res = self.fundamental_etree.findall(row_xpath)84 rows = []85 for r in res:86 v = self._normalize_number(r.text)87 if v is not None and not len(v):88 continue89 elif is_number(v):90 if is_money:91 v = Money(Decimal(v), "EUR")92 else:93 v = float(v)94 rows.append(v)95 if rows[0] != row_header:96 raise ParsingError("Unexpected 1. row header: '%s' != '%s'" %97 (rows[0], row_header))98 if len(theader) != len(rows):99 raise ParsingError("Parsing error, table header contains more"100 " elements than rows:"101 "'%s' vs '%s'" % (theader, rows))102 result = {}103 for i in range(len(rows)):104 if theader[i] == table_header:105 continue106 result[theader[i]] = rows[i]107 logger.debug("Extracted '%s' from onvista: %s" % (row_header, result))108 return result109 def eps(self):110 table_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'111 'article/article/div/table[1]/thead/tr/')112 row_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'113 'article/article/div/table[1]/tbody/tr[1]/')114 return self._extract_from_table(table_xpath, "gewinn", row_xpath,115 "gewinn pro aktie in eur", True)116 def ebit_margin(self):117 table_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'118 'article/article/div/table[8]/thead/tr/')119 row_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'120 'article/article/div/table[8]/tbody/tr[2]/')121 return self._extract_from_table(table_xpath, "rentabilität", row_xpath,122 "ebit-marge")123 def equity_ratio(self):124 table_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'125 'article/article/div/table[6]/thead/tr/')126 row_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'127 'article/article/div/table[6]/tbody/tr[2]/')128 return self._extract_from_table(table_xpath, "bilanz", row_xpath,129 "eigenkapitalquote")130 def roe(self):131 table_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'132 'article/article/div/table[8]/thead/tr/')133 row_xpath = ('.//*[@id="ONVISTA"]/div[1]/div[1]/div[1]/'134 'article/article/div/table[8]/tbody/tr[4]/')135 return self._extract_from_table(table_xpath, "rentabilität", row_xpath,136 "eigenkapitalrendite")137if __name__ == "__main__":138 logging.basicConfig(level=logging.DEBUG)139 o = OnvistaScraper("http://www.onvista.de/aktien/Bayer-Aktie-DE000BAY0017")140 print(o.analyst_ratings())141 print("ROE: %s" % o.roe())142 print("EPS: %s" % o.eps())143 print("EBIT-MARGIN: %s" % o.ebit_margin())...
utils.py
Source:utils.py
1import selenium2from selenium.webdriver.common.by import By3LATENCY = 0.54def attrs_to_dict(attributes: str):5 attrs_dict = dict()6 for keyval in attributes.split(';'):7 t = keyval.split(':')8 if len(t) > 1:9 key = t[0].strip()10 val = t[1].strip()11 attrs_dict[key] = val12 return attrs_dict13def find_row(ctx, table_xpath: str) -> bool:14 row = 215 row_xpath = table_xpath + '/tbody/tr[{}]/td[{}]'16 try:17 while True:18 n = ctx.driver.find_element(By.XPATH, row_xpath.format(row, 1)).text19 p = ctx.driver.find_element(By.XPATH, row_xpath.format(row, 2)).text.split('.')[0]20 if n == ctx.name and p == ctx.price:21 break22 row += 123 except selenium.common.exceptions.NoSuchElementException:24 return False...
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!