Автор Тема: Авариите на чез.  (Прочетена 14931 пъти)

4096bits

  • Напреднали
  • *****
  • Публикации: 4239
    • Профил
Re: Авариите на чез.
« Отговор #60 -: Feb 22, 2020, 22:59 »
Ами казах ти да сложиш твоя път до chromedriver. Не да използваш моя.
Нали си го пъхнал в /usr/bin/
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

jet

  • Напреднали
  • *****
  • Публикации: 2478
  • Distribution: debian
  • Window Manager: kde
    • Профил
Re: Авариите на чез.
« Отговор #61 -: Feb 23, 2020, 00:11 »
На оная работа път ли и викате вече  ;D
Активен

..⢀⣴⠾⠻⢶⣦⠀
  ⣾⠁⢠⠒⠀⣿⡁
  ⢿⡄⠘⠷⠚⠋
  ⠈⠳⣄⠀⠀⠀⠀  Debian, the universal operating system.

4096bits

  • Напреднали
  • *****
  • Публикации: 4239
    • Профил
Re: Авариите на чез.
« Отговор #62 -: Feb 23, 2020, 00:48 »
Така се получава  ;D
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

supportpc

  • Гост
Re: Авариите на чез.
« Отговор #63 -: Feb 24, 2020, 09:24 »
from selenium import webdriver


options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('log-level=3')
options.add_experimental_option('excludeSwitches', ['enable-logging'])

chromedriver='/usr/bin/chromedriver'

driver = webdriver.Chrome(chromedriver,
                          options=options)

driver.get('http://www.cez.bg/bg/e-uslugi/avarii-remonti.html')
driver.switch_to.frame(driver.find_elements_by_tag_name('iframe')[0])
driver.find_element_by_id('searchField').send_keys('Перник')


for element in driver.find_elements_by_class_name('ui-btn'):
    # print(element.text)
    if element.text.startswith('Перник'.upper()):
        element.click()
       
        status = driver.find_element_by_class_name('ui-body').text
        print(status)

Сега това дава
Traceback (most recent call last):
  File "chez.py", line 13, in <module>
    options=options)
TypeError: __init__() got an unexpected keyword argument 'options'

Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 4239
    • Профил
Re: Авариите на чез.
« Отговор #64 -: Feb 24, 2020, 15:02 »
Пробвай, да промениш този ред
Код:
driver = webdriver.Chrome(chromedriver,
                          options=options)
така:
Код:
driver = webdriver.Chrome(chromedriver,
                          chrome_options=options)

Ако аз използвам второто, ми излиза съобщение, че chrome_options е deprecated. Може да си инсталирал по-стара версия на Selenium.

Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

supportpc

  • Гост
Re: Авариите на чез.
« Отговор #65 -: Mar 02, 2020, 14:59 »
не става нещо
#!/usr/bin/env python3

from selenium import webdriver


options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('log-level=3')
options.add_experimental_option('excludeSwitches', ['enable-logging'])

chromedriver='/usr/bin/chromedriver'

driver = webdriver.Chrome(chromedriver,
                          chrome_options=options)
 

driver.get('http://www.cez.bg/bg/e-uslugi/avarii-remonti.html')
driver.switch_to.frame(driver.find_elements_by_tag_name('iframe')[0])
driver.find_element_by_id('searchField').send_keys('Перник')


for element in driver.find_elements_by_class_name('ui-btn'):
    # print(element.text)
    if element.text.startswith('Перник'.upper()):
        element.click()
       
        status = driver.find_element_by_class_name('ui-body').text
        print(status)


тово е грешката
Traceback (most recent call last):
  File "./chez.py", line 14, in <module>
    chrome_options=options)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/chrome/webdriver.py", line 81, in __init__
    desired_capabilities=desired_capabilities)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 157, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 252, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.5/dist-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: exited abnormally
  (unknown error: DevToolsActivePort file doesn't exist)
  (The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
  (Driver info: chromedriver=73.0.3683.75,platform=Linux 4.9.0-12-amd64 x86_64)
Активен

remotexx

  • Напреднали
  • *****
  • Публикации: 1347
    • Профил
Re: Авариите на чез.
« Отговор #66 -: Mar 02, 2020, 16:29 »
Не че съм експерт по питони, смоци и т.п. ама ето какво ми изплю търсачката за тази грешка -
  (unknown error: DevToolsActivePort file doesn't exist)

Код
GeSHi (Python):
  1. chromeOptions.add_argument("--remote-debugging-port=9222")

А в отговора има и др. пожелателни опции

https://stackoverflow.com/questions/56637973/how-to-fix-selenium-devtoolsactiveport-file-doesnt-exist-exception-in-python
Активен

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 6878
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: Авариите на чез.
« Отговор #67 -: Nov 19, 2020, 10:38 »
Днес се присетих за тази тема и по-точно за Selenum. И се сетих, че преди година време чух за поредната му алтернатива. Казва се Cypress – https://www.cypress.io/.

Тогава пича, който я препоръча, каза:

Цитат
Има изключително много възможности за тестване, само че не става за тестване на SalesForce. За всичко друго е супер и много по добре от Selenium според мене.

Сигурен съм, че професионалистите сте чували за кипариса, а някои дори сте го ползвали. Слагам го в темата само, защото по някое време почна „мерене на технологията“ и така да има още един вариант за пълнота.

Иначе Васко отдавна си е изпълнил задачата, ама това не пречи за друга случка.

Поздрави!
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

PaperNick

  • Напреднали
  • *****
  • Публикации: 291
  • Window Manager: Xfce
    • Профил
Re: Авариите на чез.
« Отговор #68 -: Nov 19, 2020, 19:11 »
Днес се присетих за тази тема и по-точно за Selenum. И се сетих, че преди година време чух за поредната му алтернатива. Казва се Cypress – https://www.cypress.io/.

Тогава пича, който я препоръча, каза:

Цитат
Има изключително много възможности за тестване, само че не става за тестване на SalesForce. За всичко друго е супер и много по добре от Selenium според мене.

Бях чувал за Cypress, но не бях цъкал с него досега. Разписах проверките за аварии на ЧЕЗ и се получи доста добре.

Ето и кода:
Код
GeSHi (Javascript):
  1. const CEZ_BREAKDOWNS_URL = 'https://info.cez.bg/js/avarii/av1.php';
  2. const NO_BREAKDOWNS_ASSERT_MESSAGE = 'няма прекъсвания на захранването';
  3.  
  4. const populatedPlaces = [
  5.  { name:'Перник', fullMatch: false },
  6.  { name:'Кюстендил', fullMatch: false },
  7.  { name: 'Буново, общ. Кюстендил', fullMatch: true },
  8. ];
  9.  
  10. describe('CEZ Breakdowns', () => {
  11.  beforeEach(() => {
  12.    // https://docs.cypress.io/api/events/catalog-of-events.html#Examples
  13.    cy.on('uncaught:exception', (err, runnable) => {
  14.      // An "Uncaught ReferenceError: object is not defined" exception is thrown from CEZ webpage.
  15.      // Ignore it so that the execution can continue.
  16.      // Return false to prevent the error from failing the current test.
  17.      return false;
  18.    });
  19.  });
  20.  
  21.  function checkBreakdown(place, fullMatch) {
  22.    it(`should not have any breakdowns for "${place}"`, () => {
  23.      cy.visit(CEZ_BREAKDOWNS_URL);
  24.  
  25.      cy.get('#searchField').type(place);
  26.  
  27.      const searchValue = fullMatch ? place.toUpperCase() : new RegExp(`^${place.toUpperCase()}`);
  28.      const placeSuggestion = cy.get('#suggestions .ui-btn').contains(searchValue, { matchCase: true });
  29.  
  30.      placeSuggestion.should('have.length.greaterThan', 0);
  31.  
  32.      placeSuggestion.click();
  33.  
  34.      cy.get('[data-role="content"] .ui-body').should('contain', NO_BREAKDOWNS_ASSERT_MESSAGE);
  35.    });
  36.  }
  37.  
  38.  populatedPlaces.forEach(place => checkBreakdown(place.name, place.fullMatch));
  39. });
  40.  

Ето и как се пуска:
Код
GeSHi (Bash):
  1. mkdir cez_checker
  2. cd cez_checker/
  3. npm init --yes
  4. npm install cypress --save-dev
  5. echo '{}' > cypress.json
  6. mkdir -p cypress/integration
  7. touch cypress/integration/cez_breakdown_spec.js
  8.  
  9. # Поставете съдържанието на скрипта в "cypress/integration/cez_breakdown_spec.js"
  10.  
  11. npx cypress run --quiet

В браузъра се пуска с:
Код
GeSHi (Bash):
  1. npx cypress open

След изпълнението има дори видео запис :o
Код
GeSHi (Bash):
  1. $ ls cypress/videos/
  2. cez_breakdown_spec.js.mp4

А, да, трябва да инсталирате NodeJS.
Активен

Practice

go_fire

  • Global Moderator
  • Напреднали
  • *****
  • Публикации: 6878
  • Distribution: Дебиан Сид
  • Window Manager: ROX-Desktop / е17
  • кашик с гранатомет в танково поделение
    • Профил
    • WWW
Re: Авариите на чез.
« Отговор #69 -: Nov 19, 2020, 19:18 »
Еха, Пейпър много яко. Сега разбирам думите на Алекс, че това е много добро.

Аз самия не го бях пробвал. Ама реално и Селениум не съм.

Страшен си!
Активен

В $por4e2 e истината  ;)

***

Aко даваха стипендия за най-глупави, щях да съм човека с най-много Mини Kупъри

***

Reborn since 1998 || 15.09.2007 totally М$ free && conscience clear

Demayl

  • Напреднали
  • *****
  • Публикации: 104
  • Distribution: XUbuntu,FreeBSD
  • Window Manager: Xfce
    • Профил
    • WWW
Re: Авариите на чез.
« Отговор #70 -: Nov 23, 2020, 17:34 »
Ето едно примерче за София - Перник е с ид 149
Код
GeSHi (Bash):
  1. curl -d "city_id=153&page=1" -X POST https://info.cez.bg/js/avarii/contents.php | grep -oP '<span style="float:left;font-size:small">.*?<\/span>' | sed 's/<[^b][^<>]*>//g'
Активен

supportpc

  • Гост
Re: Авариите на чез.
« Отговор #71 -: Dec 08, 2020, 13:12 »
Как мога да го визуализирам в php,  пробвах с това shell-exec не става

Ето едно примерче за София - Перник е с ид 149
Код
GeSHi (Bash):
  1. curl -d "city_id=153&page=1" -X POST https://info.cez.bg/js/avarii/contents.php | grep -oP '<span style="float:left;font-size:small">.*?<\/span>' | sed 's/<[^b][^<>]*>//g'
« Последна редакция: Dec 08, 2020, 13:27 от supportpc »
Активен

PaperNick

  • Напреднали
  • *****
  • Публикации: 291
  • Window Manager: Xfce
    • Профил
Re: Авариите на чез.
« Отговор #72 -: Dec 08, 2020, 15:01 »
Как мога да го визуализирам в php,  пробвах с това shell-exec не става

Ето едно примерче за София - Перник е с ид 149
Код
GeSHi (Bash):
  1. curl -d "city_id=153&page=1" -X POST https://info.cez.bg/js/avarii/contents.php | grep -oP '<span style="float:left;font-size:small">.*?<\/span>' | sed 's/<[^b][^<>]*>//g'

Не е нужно да използваш shell_exec, просто направи заявката от PHP.
Ето какво сътворих набързо използвайки регулярния израз на колегата:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $SOFIA = 153;
  4. $PERNIK = 129;
  5. $NO_BREAKDOWNS_MESSAGE = 'няма прекъсвания на захранването';
  6.  
  7. $requestOptions = [
  8.    'http' => [
  9.        'method'=> 'POST',
  10.        'header' => 'Content-type: application/x-www-form-urlencoded',
  11.        'content' => http_build_query(['city_id' => $SOFIA, 'page' => 1])
  12.    ],
  13. ];
  14.  
  15. $context = stream_context_create($requestOptions);
  16. $fp = fopen('https://info.cez.bg/js/avarii/contents.php', 'r', false, $context);
  17. $pageContent = stream_get_contents($fp);
  18. fclose($fp);
  19.  
  20. if (strpos($pageContent, $NO_BREAKDOWNS_MESSAGE) !== false) {
  21.    echo 'Няма авария' . PHP_EOL;
  22. } else {
  23.    echo 'Има Авария' . PHP_EOL;
  24. }
  25.  
  26. $regionBreakdownPattern = '/<span style="float:left;font-size:small">(.*?)<\/span>/i';
  27. preg_match_all($regionBreakdownPattern, $pageContent, $breakdowns);
  28.  
  29. foreach ($breakdowns[1] as $breakdown) {
  30.    echo $breakdown . PHP_EOL;
  31. }

Голяма част от кода я взех директно от документацията:

В София има авария в момента и ми изкарва това:
Цитат
Има Авария
жк.ХИПОДРУМА<br>СМИЛИЦА
жк.ХИПОДРУМА<br>ХИПОДРУМА
жк.ХИПОДРУМА<br>ПИРИНСКИ ИЗВОР
жк.ХИПОДРУМА<br>КЮСТЕНДИЛ/АТАНАС НЕНОВ/
жк.БАНИШОРА<br>БАНИШОРА
жк.БАНИШОРА<br>ГЕН. СТОЛЕТОВ
жк.БАНИШОРА<br>ИВАН ТУРГЕНЕВ

Edit: разписах го на PHP 7.2
« Последна редакция: Dec 08, 2020, 15:12 от PaperNick »
Активен

Practice

supportpc

  • Гост
Re: Авариите на чез.
« Отговор #73 -: Dec 08, 2020, 16:20 »
А реално как ще стане със всички ID които има чез. Благодаря предварително

Как мога да го визуализирам в php,  пробвах с това shell-exec не става

Ето едно примерче за София - Перник е с ид 149
Код
GeSHi (Bash):
  1. curl -d "city_id=153&page=1" -X POST https://info.cez.bg/js/avarii/contents.php | grep -oP '<span style="float:left;font-size:small">.*?<\/span>' | sed 's/<[^b][^<>]*>//g'

Не е нужно да използваш shell_exec, просто направи заявката от PHP.
Ето какво сътворих набързо използвайки регулярния израз на колегата:
Код
GeSHi (PHP):
  1. <?php
  2.  
  3. $SOFIA = 153;
  4. $PERNIK = 129;
  5. $NO_BREAKDOWNS_MESSAGE = 'няма прекъсвания на захранването';
  6.  
  7. $requestOptions = [
  8.    'http' => [
  9.        'method'=> 'POST',
  10.        'header' => 'Content-type: application/x-www-form-urlencoded',
  11.        'content' => http_build_query(['city_id' => $SOFIA, 'page' => 1])
  12.    ],
  13. ];
  14.  
  15. $context = stream_context_create($requestOptions);
  16. $fp = fopen('https://info.cez.bg/js/avarii/contents.php', 'r', false, $context);
  17. $pageContent = stream_get_contents($fp);
  18. fclose($fp);
  19.  
  20. if (strpos($pageContent, $NO_BREAKDOWNS_MESSAGE) !== false) {
  21.    echo 'Няма авария' . PHP_EOL;
  22. } else {
  23.    echo 'Има Авария' . PHP_EOL;
  24. }
  25.  
  26. $regionBreakdownPattern = '/<span style="float:left;font-size:small">(.*?)<\/span>/i';
  27. preg_match_all($regionBreakdownPattern, $pageContent, $breakdowns);
  28.  
  29. foreach ($breakdowns[1] as $breakdown) {
  30.    echo $breakdown . PHP_EOL;
  31. }

Голяма част от кода я взех директно от документацията:

В София има авария в момента и ми изкарва това:
Цитат
Има Авария
жк.ХИПОДРУМА<br>СМИЛИЦА
жк.ХИПОДРУМА<br>ХИПОДРУМА
жк.ХИПОДРУМА<br>ПИРИНСКИ ИЗВОР
жк.ХИПОДРУМА<br>КЮСТЕНДИЛ/АТАНАС НЕНОВ/
жк.БАНИШОРА<br>БАНИШОРА
жк.БАНИШОРА<br>ГЕН. СТОЛЕТОВ
жк.БАНИШОРА<br>ИВАН ТУРГЕНЕВ

Edit: разписах го на PHP 7.2
Активен

PaperNick

  • Напреднали
  • *****
  • Публикации: 291
  • Window Manager: Xfce
    • Профил
Re: Авариите на чез.
« Отговор #74 -: Dec 08, 2020, 16:46 »
А реално как ще стане със всички ID които има чез. Благодаря предварително

Ми така като гледам, предложенията за градове ги взима от самата HTML без да прави други заявки:
Ако прегледаш изходния код на страницата https://info.cez.bg/js/avarii/av1.php ще видиш всички имена и id-та на ред 249:
Код:
autocompleteData = $.parseJSON('[{"value":"153","label":"СОФИЯ"}.....
Активен

Practice