<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Доктор Лексиум</title>
	<atom:link href="https://www.lexium.ru/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.lexium.ru</link>
	<description>Разработка сайтов и веб-приложений</description>
	<lastBuildDate>Mon, 08 Apr 2024 08:46:25 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.lexium.ru/images/2020/11/cropped-favicon-lex-512-32x32.png</url>
	<title>Доктор Лексиум</title>
	<link>https://www.lexium.ru</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Как отключить автозапуск FortiClient в Windows 10</title>
		<link>https://www.lexium.ru/2024/04/kak-otklyuchit-avtozapusk-forticlient-v-windows-10/</link>
					<comments>https://www.lexium.ru/2024/04/kak-otklyuchit-avtozapusk-forticlient-v-windows-10/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Mon, 08 Apr 2024 08:33:56 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9849</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2024/04/photo_2024-04-08_11-33-19-200x200.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" srcset="https://www.lexium.ru/images/2024/04/photo_2024-04-08_11-33-19-200x200.jpg 200w, https://www.lexium.ru/images/2024/04/photo_2024-04-08_11-33-19-410x410.jpg 410w, https://www.lexium.ru/images/2024/04/photo_2024-04-08_11-33-19-800x800.jpg 800w, https://www.lexium.ru/images/2024/04/photo_2024-04-08_11-33-19-768x768.jpg 768w, https://www.lexium.ru/images/2024/04/photo_2024-04-08_11-33-19.jpg 1280w" sizes="(max-width: 200px) 100vw, 200px" /><p>Некоторые компании, из соображений безопасности, закрывают корпоративную сеть на внешку, а потому войти туда можно только через корпоративный VPN. В качестве VPN-клиента, некоторые из них, используют FortiClient. Одной из особенностей FortiClient является его автозапуск при старте системы, который никак не отключить. Зачем вообще отключать автозапуск FortiClient? Не проще удалить приложение совсем? Проще. Но, допустим, вас перевели в другой отдел, а там используют совсем другой VPN-клиент. Однако, удалять FortiClient вы не...</p>
The post <a href="https://www.lexium.ru/2024/04/kak-otklyuchit-avtozapusk-forticlient-v-windows-10/">Как отключить автозапуск FortiClient в Windows 10</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Некоторые компании, из соображений безопасности, закрывают корпоративную сеть на внешку, а потому войти туда можно только через корпоративный VPN. В качестве VPN-клиента, некоторые из них, используют FortiClient.</p>
<p>Одной из особенностей FortiClient является его автозапуск при старте системы, который никак не отключить.<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<p>Зачем вообще отключать автозапуск FortiClient? Не проще удалить приложение совсем?</p>
<p>Проще. Но, допустим, вас перевели в другой отдел, а там используют совсем другой VPN-клиент. Однако, удалять FortiClient вы не желаете, поскольку вас запросто могут перевести обратно, и вам очень не хочется заново проходить довольно непростую настройку FortiClient.</p>
<p>Чтобы всякий раз не выключать FortiClient вручную (от имени администратора), <strong>нужно всего-лишь отключить автозапуск</strong>.</p>
<div class="z">Вот только разработчики этого программного продукта не предусмотрели подобное действие. Т.е. в настройках FortiClient нет такой возможности, а в стандартном приложении Windows 10 &#8212; &#171;Автозагрузка&#187;, где можно легко выключать автостарт программ, строчка с FortiClient загадочно отсутствует.</div>
<p>Значит, придётся идти другим путём, и мы не побоимся его пройти.</p>
<div class="z"><strong>Из минусов:</strong> После отключения автозапуска, вы уже не сможете запустить FortiClient. Т.е. это, по сути, такая альтернатива удалению FortiClient, чтобы не терять доступы. Хотя, в конце поста я расскажу как реанимировать FortiClient, если он снова понадобился.</div>
<h2>Способ отключения автозапуска FortiClient, во всей красе и всего из пяти пунктов</h2>
<p><strong>Шаг 1.</strong> Щелкните правой кнопкой мыши значок FortiClient на панели задач и выберите Shutdown FortiClient (т.е. отключите его).&nbsp;</p>
<p><strong>Шаг 2.</strong> Перейдите в командную строку (под администратором), введите: net stop fortishield и прожмите ENTER.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">net stop fortishield</pre>
<p><strong>Шаг 3.</strong> Прожмите горячие клавиши Win-R (запустится приложение &#171;Выполнить&#187;), введите в текстовое поле msconfig, прожмите ОК.</p>
<p><a href="https://www.lexium.ru/images/2024/04/2024-04-08_11-10-18.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img fetchpriority="high" decoding="async" class="size-full wp-image-9851 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2024/04/2024-04-08_11-10-18.png" alt="" width="424" height="205"></a></p>
<p>Откроется приложение &#171;Конфигурация системы&#187;. В ней нужно перейти во вкладку Службы (Services), снять флажок на FortiClient Service Scheduler и прожать кнопку &#171;Применить&#187;.</p>
<p><a href="https://www.lexium.ru/images/2024/04/2024-04-08_11-11-24.png" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title=""><img decoding="async" class="size-full wp-image-9850 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2024/04/2024-04-08_11-11-24.png" alt="" width="567" height="382"></a></p>
<div class="w">В этом месте компьютер перезагружать не нужно!</div>
<p><strong>Шаг 4.</strong> Перейдите в Пуск и напишите там &#171;Службы&#187; (имеется в виду поиск). В результатах поиска вижу вот это.</p>
<p><a href="https://www.lexium.ru/images/2024/04/2024-04-08_11-15-11.png" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9853 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2024/04/2024-04-08_11-15-11.png" alt="" width="368" height="157"></a></p>
<p>Кликаю и открываю приложение &#171;Службы&#187;.</p>
<p><a href="https://www.lexium.ru/images/2024/04/2024-04-08_11-17-06.png" data-rel="lightbox-image-3" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-large wp-image-9852 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2024/04/2024-04-08_11-17-06-800x235.png" alt="" width="800" height="235"></a></p>
<p>В приложении найдите строку FortiClient Service Scheduler. Щелкните правой кнопкой мыши по данной строке, выберите пункт &#171;Свойства&#187;, измените тип запуска на: &#171;Ручной&#187;.</p>
<p><strong>Шаг 5.</strong> Перезагрузите компьютер.</p>
<p>Всё. FortiClient перестал стартовать вместе с системой.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Как и говорилось выше, при попытке старта FortiClient вручную, он будет ругаться вот таким окном.</p>
<p><a href="https://www.lexium.ru/images/2024/04/2024-04-08_11-22-48.png" data-rel="lightbox-image-4" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9854 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2024/04/2024-04-08_11-22-48.png" alt="" width="352" height="144"></a></p>
<div class="comment">При этом, совершенно не важно запускаете ли вы его от имени администратора или нет.</div>
<p>Если всё-таки <strong>нужно стартовать</strong> то вам достаточно <strong>повторить</strong> шаги 2 и 3.</p>
<p>Только <strong>в шаге 2</strong> нужно использовать вот такую команду. Она запустит отключенную службу.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">net start fortishield</pre>
<p>А <strong>в шаге 3</strong> не снимать флажок, а наоборот, <strong>проставить его обратно</strong>. И прожать &#171;Применить&#187;.</p>
<p>Перезагрузка системы, в моём случае не потребовалась. FortiClient запустился без проблем.&nbsp;Вроде ничего сложного.</p>
<p style="text-align: right;"><em><strong>А с вами был Доктор Лексиум.</strong></em><br />
<em><strong>До новых постов.</strong></em></p>The post <a href="https://www.lexium.ru/2024/04/kak-otklyuchit-avtozapusk-forticlient-v-windows-10/">Как отключить автозапуск FortiClient в Windows 10</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2024/04/kak-otklyuchit-avtozapusk-forticlient-v-windows-10/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как поставить паузу в дебагере ГуглХрома?</title>
		<link>https://www.lexium.ru/2023/10/kak-postavit-pauzu-v-debagere-guglkhroma/</link>
					<comments>https://www.lexium.ru/2023/10/kak-postavit-pauzu-v-debagere-guglkhroma/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Sun, 15 Oct 2023 12:06:26 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9829</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2023/10/c974d875e0004aa98cd0bfb5908bec24_fuse_4439945_0-200x200.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" srcset="https://www.lexium.ru/images/2023/10/c974d875e0004aa98cd0bfb5908bec24_fuse_4439945_0-200x200.jpg 200w, https://www.lexium.ru/images/2023/10/c974d875e0004aa98cd0bfb5908bec24_fuse_4439945_0-410x410.jpg 410w, https://www.lexium.ru/images/2023/10/c974d875e0004aa98cd0bfb5908bec24_fuse_4439945_0-800x800.jpg 800w, https://www.lexium.ru/images/2023/10/c974d875e0004aa98cd0bfb5908bec24_fuse_4439945_0-768x768.jpg 768w, https://www.lexium.ru/images/2023/10/c974d875e0004aa98cd0bfb5908bec24_fuse_4439945_0.jpg 1024w" sizes="auto, (max-width: 200px) 100vw, 200px" /><p>Зачем нужно делать паузу в панели отладки браузера Гугл Хром или Яндекс? В ходе написания автотеста мне время от времени нужно добывать селекторы из кода веб-страницы. Отличным инструментом для этого является дебагер (DevTools). Она-же &#8212; инструменты разработчика. Это на редкость удобный инструмент, необходимый для веб-разработчика, но не только. Однажды я столкнулся с сайтом, у которого, при нажатии на поле селектора появлялось модальное окно, где можно было выбрать нужный вариант. И...</p>
The post <a href="https://www.lexium.ru/2023/10/kak-postavit-pauzu-v-debagere-guglkhroma/">Как поставить паузу в дебагере ГуглХрома?</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<h2><strong>Зачем нужно делать паузу в панели отладки браузера Гугл Хром или Яндекс?</strong></h2>
<p>В ходе написания автотеста мне время от времени нужно добывать селекторы из кода веб-страницы. Отличным инструментом для этого является дебагер (DevTools). Она-же &#8212; инструменты разработчика.</p>
<p><!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<div class="comment">Тот самый DevTools, который вызывается нажатием клавиши F12.</div>
<p>Это на редкость удобный инструмент, необходимый для веб-разработчика, но не только.</p>
<p>Однажды я столкнулся с сайтом, у которого, при нажатии на поле селектора появлялось модальное окно, где можно было выбрать нужный вариант. И всё-бы ничего, но с этим возникла проблема.</p>
<p>Дело в том, что если на выбранном варианте нажать левую кнопку мыши (ЛКМ), то нужный пункт выбирается, как и задумано авторами. Однако, при нажатии на правую кнопку (или на любое другое действие) модальное окно просто исчезало.</p>
<div class="comment">И ладно-бы только это! Оно исчезало из DOM&#8217;а! Полностью! Навсегда! Пока снова не ткнёшь в поле.</div>
<p>Таким образом, чтобы понять из каких селекторов состояло это модальное окно, нужно было запаузить содержимое страницы в тот момент, когда оно появилось.</p>
<h2>Как это сделать?</h2>
<p>В интернете описано множество способов, но я для себя написал вот этот короткий скрипт.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">document.addEventListener('keyup',function(event){if(event.key=='F9'){setTimeout(()=&gt;{debugger;},3000);}});</pre>
<p>Чтобы им воспользоваться, достаточно скопировать, перейти на нужный сайт, запустить панель отладки (F12), выбрать в ней вкладку Консоль.</p>
<p><a href="https://www.lexium.ru/images/2023/10/2023-10-15_14-51-20.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9834 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2023/10/2023-10-15_14-51-20.png" alt="" width="538" height="141"></a>&nbsp;</p>
<p>В консоль вписать фразу &#171;allow pasting&#187; (естественно, без кавычек) и прожать Enter.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">allow pasting</pre>
<p><em>Иначе консоль ГуглоХрома откажется принимать вставку скрипта.</em></p>
<p><a href="https://www.lexium.ru/images/2023/10/2024-02-09_13-00-29.png" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9842 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2023/10/2024-02-09_13-00-29.png" alt="" width="511" height="87"></a></p>
<p>После этого вставьте код скрипта в консоль и прожмите Enter.</p>
<p><a href="https://www.lexium.ru/images/2023/10/2023-10-15_14-51-40.png" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9833 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2023/10/2023-10-15_14-51-40.png" alt="" width="543" height="132"></a></p>
<div class="comment">Всё! Главное дело сделано.</div>
<p>Теперь, будучи на странице сайта, прожимаем F9 и, в течение трёх секунд (пока на сработала пауза), нажимаем на тот элемент, который вызывает нужное модальное окно.</p>
<p><a href="https://www.lexium.ru/images/2023/10/2023-10-15_14-52-52.png" data-rel="lightbox-image-3" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9831 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2023/10/2023-10-15_14-52-52.png" alt="" width="609" height="646"></a></p>
<p>Там появится характерная плашка, через которую паузу можно будет снять.</p>
<p>Из минусов: страница становится недоступной для того, чтобы прямо на ней выделить нужный элемент и посмотреть его в дебагере. Однако, можно перейти во вкладку Elements и искать нужное прямо там.</p>
<p><a href="https://www.lexium.ru/images/2023/10/2023-10-15_15-02-06.png" data-rel="lightbox-image-4" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-large wp-image-9835 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2023/10/2023-10-15_15-02-06-800x290.png" alt="" width="800" height="290"></a></p>
<p>Это не очень удобно, но вполне реально.</p>
<p>Ну а после снятия с паузы можно снова прожать F9, ткнуть уже в другой элемент (вызывающий очередную &#171;исчезающую модалку&#187;), снова дождаться паузы и найти искомые элементы.</p>
<p><a href="https://www.lexium.ru/images/2023/10/2023-10-15_15-04-20.png" data-rel="lightbox-image-5" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9836 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2023/10/2023-10-15_15-04-20.png" alt="" width="508" height="377"></a></p>
<p>Я проверил, у меня работает. Во всяком случае пока.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Если тебе был полезен этот пост, пожалуйста поддержи автора.</p>
<p style="text-align: right;"><em><strong>Ну а с вами был Доктор Лексиум.</strong></em><br />
<em><strong>До новых постов.</strong></em></p>The post <a href="https://www.lexium.ru/2023/10/kak-postavit-pauzu-v-debagere-guglkhroma/">Как поставить паузу в дебагере ГуглХрома?</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2023/10/kak-postavit-pauzu-v-debagere-guglkhroma/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как запустить в Windows несколько экземпляров автотеста одновременно?</title>
		<link>https://www.lexium.ru/2023/06/kak-zapustit-v-windows-neskolko-ehkzemplyarov-avtotesta-odnovremenno/</link>
					<comments>https://www.lexium.ru/2023/06/kak-zapustit-v-windows-neskolko-ehkzemplyarov-avtotesta-odnovremenno/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Mon, 26 Jun 2023 10:12:11 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9785</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2023/06/photo_2023-06-26_13-10-16-200x200.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" srcset="https://www.lexium.ru/images/2023/06/photo_2023-06-26_13-10-16-200x200.jpg 200w, https://www.lexium.ru/images/2023/06/photo_2023-06-26_13-10-16-410x410.jpg 410w, https://www.lexium.ru/images/2023/06/photo_2023-06-26_13-10-16-800x800.jpg 800w, https://www.lexium.ru/images/2023/06/photo_2023-06-26_13-10-16-768x768.jpg 768w, https://www.lexium.ru/images/2023/06/photo_2023-06-26_13-10-16.jpg 1280w" sizes="auto, (max-width: 200px) 100vw, 200px" /><p>Возникла гипотеза о том, что один из багов на моём стенде возникает из за одновременных попыток авторизации сразу нескольких автотестов. Как проверить? Можно открыть несколько вкладок браузера в режиме инкогнито, открыть в каждом по сайту и попытаться одновременно залогиниться. Но у такого подхода есть два минуса. Во-первых, настройки теста меняют поведение браузера. Так что ручной запуск может быть неинформативным (хотя с этого я и начал). Во-вторых, ну сколько вкладок можно...</p>
The post <a href="https://www.lexium.ru/2023/06/kak-zapustit-v-windows-neskolko-ehkzemplyarov-avtotesta-odnovremenno/">Как запустить в Windows несколько экземпляров автотеста одновременно?</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Возникла гипотеза о том, что один из багов на моём стенде возникает из за одновременных попыток авторизации сразу нескольких автотестов.</p>
<p><strong>Как проверить?</strong><br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<p>Можно открыть несколько вкладок браузера в режиме инкогнито, открыть в каждом по сайту и попытаться одновременно залогиниться. Но у такого подхода есть два минуса.</p>
<ul>
<li>Во-первых, настройки теста меняют поведение браузера. Так что ручной запуск может быть неинформативным (хотя с этого я и начал).</li>
<li>Во-вторых, ну сколько вкладок можно запустить таким образом. Две? Три? А если хочу сразу 10?</li>
</ul>
<p>Я работаю из под Windows 10, а потому следующим этапом стало создание двух cmd-файлов.</p>
<p><a name="cross1"></a><accontent index="1">Первый &#8212; запускает один автотест. Вот его примерный текст.</p>
<p><strong>starter.cmd</strong></p>
<p>[code]cd C:\pyproject\<br />
venv\Scripts\pytest.exe \tests\test_auth.py<br />
pause[/code]</p>
<ul>
<li>Первая строка переходит в папку проекта.</li>
<li>Вторая &#8212; запускает нужный мне автотест.</li>
<li>Третья &#8212; ставит паузу, чтобы окно не захлопнулось сразу после окончания теста. Это на всякий случай.</li>
</ul>
<p>Второй файл &#8212; запускает заданное количество экземпляров первого файла.</p>
<p><strong>multistarter.cmd</strong></p>
<p>[code]cd C:\pyproject\<br />
set x=0<br />
:A<br />
set /a x=%x%+1<br />
start starter.cmd<br />
if not %x%==10 goto :A[/code]</p>
<p>В первой строке мы переходим в папку проекта (где лежит starter.cmd). В последней &#8212; задано количество одновременно запущенных экземпляров starter.cmd</p>
<p>Всё. Теперь запускаю <strong>multistarter.cmd</strong> и наслаждаюсь процессом.</accontent></p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Вместо C:\pyproject\ можно указать путь к папке, где лежат оба ваши cmd-файла.<br />
Вместо venv\Scripts\pytest.exe \tests\crowd_mos_ru\ideas\test_proverka_predlozhit_ideju.py &#8212; любую другую программу, которую нужно запустить в нескольких экземплярах.</p>
<p>Все экземпляры автотеста авторизовались и отработали без ошибок. Баг не подтвердился.<br />
А что если один из автотестов использует логаут? Пошёл копать код в поисках подобной неприятности.</p>
<p style="text-align: right;"><strong><em>А с вами был Доктор Лексиум. До новых постов.</em></strong></p>The post <a href="https://www.lexium.ru/2023/06/kak-zapustit-v-windows-neskolko-ehkzemplyarov-avtotesta-odnovremenno/">Как запустить в Windows несколько экземпляров автотеста одновременно?</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2023/06/kak-zapustit-v-windows-neskolko-ehkzemplyarov-avtotesta-odnovremenno/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Открыть xls файл в соседней вкладке, передав туда данные методом post</title>
		<link>https://www.lexium.ru/2023/01/otkryt-fajjl-v-sosednejj-vkladke-peredav-tuda-dannye-metodom-post/</link>
					<comments>https://www.lexium.ru/2023/01/otkryt-fajjl-v-sosednejj-vkladke-peredav-tuda-dannye-metodom-post/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Tue, 31 Jan 2023 19:43:51 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9769</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2023/01/2023-01-31_23-37-40-200x200.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" /><p>Имеется задача. Нужно получить выборку товаров на сайте (это просто), отметить галочкой нужные, а затем по нажатию кнопки скачать прайс-лист с выбранными товарами в формате xls. Превратить php-скрипт в xls легко. &#60;? //Генерация xls-файла header ( &#34;Expires: Mon, 1 Apr 1974 05:00:00 GMT&#34; ); header ( &#34;Last-Modified: &#34; . gmdate(&#34;D,d M YH:i:s&#34;) . &#34; GMT&#34; ); header ( &#34;Cache-Control: no-cache, must-revalidate&#34; ); header ( &#34;Pragma: no-cache&#34; ); header ( &#34;Content-type:...</p>
The post <a href="https://www.lexium.ru/2023/01/otkryt-fajjl-v-sosednejj-vkladke-peredav-tuda-dannye-metodom-post/">Открыть xls файл в соседней вкладке, передав туда данные методом post</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Имеется задача. Нужно получить выборку товаров на сайте (это просто), отметить галочкой нужные, а затем по нажатию кнопки скачать прайс-лист с выбранными товарами в формате xls.</p>
<p>Превратить php-скрипт в xls легко.<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<pre class="brush: plain; title: ; notranslate">&lt;? //Генерация xls-файла
header ( &quot;Expires: Mon, 1 Apr 1974 05:00:00 GMT&quot; );
header ( &quot;Last-Modified: &quot; . gmdate(&quot;D,d M YH:i:s&quot;) . &quot; GMT&quot; );
header ( &quot;Cache-Control: no-cache, must-revalidate&quot; );
header ( &quot;Pragma: no-cache&quot; );
header ( &quot;Content-type: application/vnd.ms-excel;charset=UTF-8;&quot; );
header ( &quot;Content-Disposition: attachment; filename=items_export.xls&quot; );
?&gt;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//RU&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;ru&quot; lang=&quot;ru&quot;&gt;
&lt;head&gt;
&lt;meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
&lt;meta name=&quot;author&quot; content=&quot;none&quot; /&gt;
&lt;title&gt;Demo&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;table&gt;&lt;tr&gt;&lt;th&gt;Заголовок&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Содержимое&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/body&gt;
&lt;/html&gt;</pre>
<p>По сути php файл прикинется файлом xls.</p>
<p>Осталось только передать ему ID нужных товаров. И вот в этом получается затык.</p>
<p>Есть ajax. С его помощью можно передать данные серверному скрипту и получить от него ответ. Однако с его помощью нельзя получить файл и открыть его в соседней вкладке. И тогда на помощь приходит костыль.</p>
<p>Создаём скрытую форму со скрытым текстовым полем. Прописываем в тэге form путь к php-скрипту и его открытие в соседней вкладке.</p>
<pre class="brush: plain; title: ; notranslate">&lt;form id=&quot;item_ids_form&quot; method=&quot;POST&quot; target=&quot;_blank&quot; action=&quot;/php_scripts/xls/&quot;&gt;
&lt;textarea style=&quot;display:none;&quot; id=&quot;item_ids_container&quot; name=&quot;item_ids&quot;&gt;&lt;/textarea&gt;
&lt;/form&gt;</pre>
<p>Делаем js-скрипт, который при работе с выборкой (при снятии/простановке галочек) будет добавлять ID в textarea нашей скрытой формы (через запятую).</p>
<div class="comment">Код js-скрипта приводить не буду, поскольку в каждой конкретной ситуации он будет отличаться.</div>
<p>Создаём кнопку получения прайс-листа, по которой эта форма будет отправляться.</p>
<pre class="brush: plain; title: ; notranslate">&lt;p&gt;&lt;button id=&quot;button_price&quot;&gt;Получить прайс&lt;/button&gt;&lt;/p&gt;</pre>
<p>Раз кнопка вне формы (поскольку форма скрыта), то пропишем для неё обработчик на js.</p>
<pre class="brush: plain; title: ; notranslate">$('#button_price').on('click', function(e){
e.preventDefault();
$(&quot;#item_ids_form&quot;).submit();
return false;
});</pre>
<div class="z">Впрочем, обработчик делать не обязательно, ведь скрыть можно не всю форму, а только поле (textarea). Тогда кнопку размещаем непосредственно в форме и отправка данных произойдёт по клику, без дополнительного js. Кнопка должна быть тэгом button, или input (с параметром type=&#8217;submit&#8217;)</div>
<p>Получается, в html-форма умеет отправить данные на страницу, которая откроется в соседнюю вкладке.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Почему было не сделать такую возможность для ajax, для меня загадка. Всего-то пару параметров добавить. Видимо не настолько часто приходится реализовывать подобное, чтобы ради этого драконить ajax.</p>The post <a href="https://www.lexium.ru/2023/01/otkryt-fajjl-v-sosednejj-vkladke-peredav-tuda-dannye-metodom-post/">Открыть xls файл в соседней вкладке, передав туда данные методом post</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2023/01/otkryt-fajjl-v-sosednejj-vkladke-peredav-tuda-dannye-metodom-post/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>PyTest: Решение проблемы с кириллицей в отчётах</title>
		<link>https://www.lexium.ru/2022/10/pytest-reshenie-problemy-s-kirillicejj-v-otchjotakh/</link>
					<comments>https://www.lexium.ru/2022/10/pytest-reshenie-problemy-s-kirillicejj-v-otchjotakh/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Fri, 21 Oct 2022 09:32:25 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9752</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2022/10/2022-10-21_12-30-35-200x200.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" /><p>Уже который день меня выбешивает одна проблема. Суть вот в чём. Имеется автотест на PyTest, для проверки сайдбара на одном сайте. Алгоритм прост: Открываю сайт, Авторизуюсь, Перехожу на первую попавшуюся страницу, В сайдбаре страницы открываю вертикальное выпадающее меню и кликаю на один из пунктов (берётся из массива), На открывшихся страницах проверяю сайдбар на наличие меню, на возможность свернуть-развернуть, на всплывающие подсказки, на ширину и прочее-прочее. И всё вроде было нормально,...</p>
The post <a href="https://www.lexium.ru/2022/10/pytest-reshenie-problemy-s-kirillicejj-v-otchjotakh/">PyTest: Решение проблемы с кириллицей в отчётах</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Уже который день меня выбешивает одна проблема. Суть вот в чём. Имеется автотест на PyTest, для проверки сайдбара на одном сайте.</p>
<p>Алгоритм прост:<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<ol>
<li>Открываю сайт,</li>
<li>Авторизуюсь,</li>
<li>Перехожу на первую попавшуюся страницу,</li>
<li>В сайдбаре страницы открываю вертикальное выпадающее меню и кликаю на один из пунктов (берётся из массива),</li>
<li>На открывшихся страницах проверяю сайдбар на наличие меню, на возможность свернуть-развернуть, на всплывающие подсказки, на ширину и прочее-прочее.</li>
</ol>
<p>И всё вроде было нормально, когда эти действия шли в обычном цикле for. Однако, у цикла был жирный минус, который всё портил.</p>
<p>Представь, что один из пунктов меню пропал. Или на одной из страниц сайдбар оказался битый. В этом месте цикла тест падал и остальные пункты меню уже не проверялись.</p>
<p>Было найдено более корректное решение &#8212; параметризованный тест. Массив такому тесту передаётся в виде параметра и тест запускается до тех пор, пока не пройдёт массив до конца.</p>
<p>Т.е. по сути это тот же цикл, но каждая итерация в нём &#8212; отдельный тест, с отдельным результатом выполнения. Таким образом я вижу в каких разделах сайта не всё в порядке с сайдбаром.</p>
<p>Вот кусок кода с примером.</p>
<pre class="brush: plain; title: ; notranslate">items_text = &#x5B;&quot;текст 1&quot;, &quot;текст 2&quot;, &quot;текст 3&quot;]
@allure.feature('Функциональное тестирование')
@pytest.mark.parametrize(&quot;item_text&quot;, items_text)
@allure.story(&quot;Общие функции сайдбара в разделе&quot;)
def test_sidebar_in(pages, item_text):
    page = SidebarElements(pages.browser)
    with allure_step(f&quot;Шаг 5: Проверка сайдбара в разделе '{item_text}'&quot;):
        print(f&quot; Раздел: '{item_text}'&quot;)
        ................</pre>
<p>Вот тут и появилась новая проблема. Дело в том, что параметры из массива PyTest отображает в отчёте. А поскольку пункты меню на русском, он заменяет кириллицу на эскейп-последовательности. Получаются совершенно неинформативные строки. И это раздражает всякий раз.</p>
<p><a href="https://www.lexium.ru/images/2022/10/2022-10-21_11-54-59.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9753 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/10/2022-10-21_11-54-59.png" alt="" width="368" height="129"></a></p>
<p>Слышал, что в PyTest 2.9 такой проблемы не было, но начиная с 3.0 &#8212; появилась.</p>
<p>Я кучу времени угрохал на то, чтобы найти решение. Баг известный, и достаточно давно, но в сети не попадалось ничего кроме стенаний пользователей. Решение нашёл мой коллега.</p>
<p>Устранить проблему PyTest с отображением кириллицы в отчётах оказалось достаточно легко, если знать как.</p>
<h2>Как исправить отображение кириллицы в отчётах PyTest?</h2>
<ul>
<li>В корень проекта кладём файлик pytest.ini</li>
<li>В фале пишем вот такой текст:</li>
</ul>
<pre class="brush: plain; title: ; notranslate">&#x5B;pytest]
disable_test_id_escaping_and_forfeit_all_rights_to_community_support = true</pre>
<p><a href="https://www.lexium.ru/images/2022/10/2022-10-21_12-03-09.png" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-large wp-image-9754 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/10/2022-10-21_12-03-09-800x365.png" alt="" width="800" height="365"></a></p>
<div class="w">Внимание, на скрине выше пропущен символ &#171;_&#187; в &#171;_all_rights_&#187;.</div>
<ul>
<li>Сохраняем.</li>
<li>??????</li>
<li>PROFIT!</li>
</ul>
<p>Вот так отчёт выглядит теперь.</p>
<p><a href="https://www.lexium.ru/images/2022/10/2022-10-21_12-17-10.png" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9758 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/10/2022-10-21_12-17-10.png" alt="" width="399" height="169"></a></p>
<p>Совсем другое дело. И в ходе выполнения теста текущие шаги тоже корректно отображают кириллицу.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Флаг &#171;disable_test_id_escaping_and_forfeit_all_rights_to_community_support&#187; экспериментальный, но работает уже несколько месяцев. Т.е. типа временный, но прижился вроде-как.</p>
<p style="text-align: right;"><strong><em>А с вами был Доктор Лексиум.</em></strong><br />
<strong><em>До новых постов.))</em></strong></p>The post <a href="https://www.lexium.ru/2022/10/pytest-reshenie-problemy-s-kirillicejj-v-otchjotakh/">PyTest: Решение проблемы с кириллицей в отчётах</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2022/10/pytest-reshenie-problemy-s-kirillicejj-v-otchjotakh/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как выделить текст на странице с помощью Python Selenium</title>
		<link>https://www.lexium.ru/2022/05/kak-vydelit-tekst-na-stranice-s-pomoshhyu-python-selenium/</link>
					<comments>https://www.lexium.ru/2022/05/kak-vydelit-tekst-na-stranice-s-pomoshhyu-python-selenium/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Thu, 26 May 2022 15:16:43 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9746</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2022/05/wp-16535781798859147832351016779712-200x200.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" srcset="https://www.lexium.ru/images/2022/05/wp-16535781798859147832351016779712-200x200.jpg 200w, https://www.lexium.ru/images/2022/05/wp-16535781798859147832351016779712-410x410.jpg 410w, https://www.lexium.ru/images/2022/05/wp-16535781798859147832351016779712-800x800.jpg 800w, https://www.lexium.ru/images/2022/05/wp-16535781798859147832351016779712-768x768.jpg 768w, https://www.lexium.ru/images/2022/05/wp-16535781798859147832351016779712.jpg 1000w" sizes="auto, (max-width: 200px) 100vw, 200px" /><p>Автоматизирую тест-кейс с помощью Python Selenium. Дохожу до очередного шага, а там написано &#171;Проверка копирования названия отчетов&#187; и скриншот, где виден выделенный заголовок. Т.е. кто-то навёл мышку на начало заголовка, зажал правую кнопку, дотянул до конца заголовка, и отпустил. А теперь, нужно это дело повторить, чтобы убедиться, что текст можно выделить. Я потратил несколько часов, чтобы реализовать данный шаг. Чего только не делал. В итоге, получилась вот такая функция, на...</p>
The post <a href="https://www.lexium.ru/2022/05/kak-vydelit-tekst-na-stranice-s-pomoshhyu-python-selenium/">Как выделить текст на странице с помощью Python Selenium</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Автоматизирую тест-кейс с помощью Python Selenium. Дохожу до очередного шага, а там написано &#171;Проверка копирования названия отчетов&#187; и скриншот, где виден выделенный заголовок.</p>
<p>Т.е. кто-то навёл мышку на начало заголовка, зажал правую кнопку, дотянул до конца заголовка, и отпустил. А теперь, нужно это дело повторить, чтобы убедиться, что текст можно выделить.<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<p>Я потратил несколько часов, чтобы реализовать данный шаг. Чего только не делал. В итоге, получилась вот такая функция, на базе запуска js.</p>
<pre class="brush: plain; title: ; notranslate">def select_string_by_css(self, css_selector):
    script1 = f&quot;var rttt = document.createRange();&quot; \
              f&quot;rttt.selectNode(document.querySelector('{css_selector}'));&quot; \
              f&quot;document.getSelection().removeAllRanges();&quot; \
              f&quot;document.getSelection().addRange(rttt);&quot;
    script2 = f&quot;return document.getSelection().toString();&quot;
    self.browser.driver.execute_script(script1)
    return str(self.browser.driver.execute_script(script2)).split(&quot;\n&quot;)&#x5B;0]</pre>
<p>Функция принимает на вход css-селектор элемента, где находится заголовок, а возвращает содержимое выделения.</p>
<p>В ходе тестов выяснилось, что на выход иногда попадают переносы строк и даже какие-то фрагменты текста из соседних областей. Пришлось обрезать по значку переноса строк.</p>
<p>Код выкладываю как есть. Поскольку функция является методом класса, там присутствует self.<br />
self.browser.driver &#8212; это объект Webdriver.</p>
<p>А вот и сам js. Вытащил его с какого-то сайта и добавил чуть-чуть отсебятины.</p>
<pre class="brush: plain; title: ; notranslate">var rttt = document.createRange();
var css_selector = &quot;h1&quot;;
rttt.selectNode(document.querySelector('{css_selector}'));
document.getSelection().removeAllRanges();
document.getSelection().addRange(rttt);
var result = document.getSelection().toString();</pre>
<p>Таким образом, селектор будет в переменной css_selector, а результат (в нашем случае &#8212; выделенный текст) &#8212; в переменной result.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Оставляю здесь, чтобы снова не искать долго-долго-долго.</p>
<p style="text-align: right;"><em><strong>С вами был Доктор Лексиум.</strong></em><br />
<em><strong>Всего доброго.</strong></em></p>The post <a href="https://www.lexium.ru/2022/05/kak-vydelit-tekst-na-stranice-s-pomoshhyu-python-selenium/">Как выделить текст на странице с помощью Python Selenium</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2022/05/kak-vydelit-tekst-na-stranice-s-pomoshhyu-python-selenium/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как одновременно открыть несколько браузеров Яндекс с разными профилями под Windows?</title>
		<link>https://www.lexium.ru/2022/04/kak-odnovremenno-otkryt-neskolko-brauzerov-yandeks-s-raznymi-profilyami-pod-windows/</link>
					<comments>https://www.lexium.ru/2022/04/kak-odnovremenno-otkryt-neskolko-brauzerov-yandeks-s-raznymi-profilyami-pod-windows/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Thu, 07 Apr 2022 11:25:30 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9730</guid>

					<description><![CDATA[<img width="199" height="200" src="https://www.lexium.ru/images/2022/04/2022-04-07_14-25-04.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" /><p>Для начала вопрос: Зачем вообще нужно одновременно открывать несколько браузеров Яндекс с разными профилями под Windows? Если ты рядовой пользователь, который ходит в интернет что-нибудь почитать или посмотреть, то тебе это не нужно от слова &#171;почти совсем&#187;. Однако, ситуации бывают разные. Например, ты хочешь разделить работу и отдых. Т.е. в одном браузере у тебя открыт Гугл, где ты авторизован под неким логином. Там у тебя открыты определённые вкладки и стоят...</p>
The post <a href="https://www.lexium.ru/2022/04/kak-odnovremenno-otkryt-neskolko-brauzerov-yandeks-s-raznymi-profilyami-pod-windows/">Как одновременно открыть несколько браузеров Яндекс с разными профилями под Windows?</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Для начала вопрос: <strong>Зачем вообще нужно одновременно открывать несколько браузеров Яндекс с разными профилями под Windows?</strong></p>
<p>Если ты рядовой пользователь, который ходит в интернет что-нибудь почитать или посмотреть, то тебе это не нужно от слова &#171;почти совсем&#187;. Однако, ситуации бывают разные. Например, ты хочешь разделить работу и отдых.<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<p>Т.е. в одном браузере у тебя открыт Гугл, где ты авторизован под неким логином. Там у тебя открыты определённые вкладки и стоят какие-то плагины.</p>
<p>А теперь, ты хочешь открыть в соседнем окне другой браузер, где в Гугле ты авторизован под другим пользователем, там другие вкладки, другие плагины и т.д.</p>
<div class="comment">Согласись, что в подобном случае удобно иметь на рабочем столе два ярлыка: Работа и Отдых, соответственно.</div>
<p>Теперь давай рассмотрим, Как одновременно открыть несколько браузеров Яндекс с разными профилями под Windows?</p>
<p><strong>1. Для начала, понадобится скачать и установить Яндекс.Браузер. </strong></p>
<p>Для этого нужно открыть yandex.ru и написать там &#171;яндекс браузер скачать&#187;, перейти по полученной ссылке и.. Ну ты понимаешь.</p>
<div class="comment">Это элементарный шаг, а потому не буду останавливаться на нём подробно.</div>
<p><a href="https://www.lexium.ru/images/2022/04/2022-04-07_14-06-31.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9731 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/04/2022-04-07_14-06-31.png" alt="" width="117" height="99"></a></p>
<p>Итак, браузер установлен. На рабочем столе даже появился характерный ярлык.</p>
<p><strong>2. Создаём папки для профилей. Их будет два: job и rest.</strong></p>
<p>Тут тоже всё просто. Переходим на диск <strong>C:</strong> и создаём там папку <strong>Browsers</strong>. Открываем её и уже в ней создаём папки <strong>job</strong> и <strong>rest</strong>.</p>
<p><strong>3. Делаем копию ярлыка Yandex на рабочем столе.</strong></p>
<p>Для этого клацаем по нему правой кнопкой мыши. В контекстном меню (которое выпало при клике) выбираем <strong>&#171;Копировать&#187;</strong>.</p>
<p>Потом, клацаем правой кнопкой мыши на пустом месте рабочего стола и в контекстном меню жмём <strong>&#171;Вставить&#187;</strong>.</p>
<p><a href="https://www.lexium.ru/images/2022/04/2022-04-07_14-09-48.png" data-rel="lightbox-image-1" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9732 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/04/2022-04-07_14-09-48.png" alt="" width="103" height="105"></a></p>
<p>Если всё сделано правильно, у нас появится копия этого ярлыка. Переименуйте его в <strong>Job</strong>. Повторите процедуру и новую копию переименуйте в <strong>Rest</strong>.</p>
<div class="comment">Копий можно сделать столько, сколько профилей вам нужно. Названия, соответственно, тоже можно делать любые.</div>
<p><strong>4. Вносим изменения в ярлык.</strong></p>
<p>Кликаем правой кнопкой мыши по ярлыку Job и в выпадающем меню выбираем <strong>&#171;Свойства&#187;</strong>.</p>
<p><a href="https://www.lexium.ru/images/2022/04/2022-04-07_14-12-04.png" data-rel="lightbox-image-2" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-medium wp-image-9733 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/04/2022-04-07_14-12-04-410x173.png" alt="" width="410" height="173"></a></p>
<p>В появившемся окне нас интересует поле <strong>&#171;Объект&#187;</strong>.&nbsp;</p>
<p><a href="https://www.lexium.ru/images/2022/04/2022-04-07_14-14-23.png" data-rel="lightbox-image-3" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-medium wp-image-9734 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/04/2022-04-07_14-14-23-410x522.png" alt="" width="410" height="522"></a></p>
<p>Кликаем по полю, переходим в конец строки и (через пробел) добавляем туда вот это:</p>
<pre class="brush: plain; title: ; notranslate">--user-data-dir=&quot;C:\Browsers\job&quot;</pre>
<p>Жмём кнопку &#171;Применить&#187;. Ярлык готов.</p>
<p>Кликаем по нему, выполняем требования браузера и вот рабочая версия готова.</p>
<p>Ту же процедуру проводим для отдыхательной версии. Только указываем другую папку для хранения профиля и прочих данных.</p>
<pre class="brush: plain; title: ; notranslate">--user-data-dir=&quot;C:\Browsers\rest&quot;</pre>
<p>В нашем случае, это папка <strong>rest</strong> (которую мы создали в шаге 2).</p>
<p>Ничего сложного. Теперь, кликнув сначала на один ярлык, а затем на другой мы одновременно открываем несколько браузеров Яндекс с разными профилями.</p>
<div class="comment">По крайней мере на Windows 10 это работает. У меня.</div>
<p>А на этом всё.</p>
<p><strong>(UPDATE 04.05.2022):</strong> Как выяснилось немного позднее, яндекс-браузер умеет переписывать ярлыки.<em> Не спрашивай зачем.</em> Поэтому, перед тем как сохранить ярлык (или открыв его свойства), следует проставить галочку в чекбоксе &#171;Только чтение&#187; во вкладке &#171;Общие&#187;.</p>
<p><a href="https://www.lexium.ru/images/2022/04/2022-05-04_13-10-58.png" data-rel="lightbox-image-4" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="size-full wp-image-9741 aligncenter" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2022/04/2022-05-04_13-10-58.png" alt="" width="369" height="38"></a></p>
<p>Это должно помочь.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Если этот пост был полезен, буду рад вашему пожертвованию на печеньки к чаю.</p>
<p style="text-align: right;"><em><strong>А с вами был Доктор Лексиум.</strong></em><br />
<em><strong>Всего доброго.</strong></em></p>The post <a href="https://www.lexium.ru/2022/04/kak-odnovremenno-otkryt-neskolko-brauzerov-yandeks-s-raznymi-profilyami-pod-windows/">Как одновременно открыть несколько браузеров Яндекс с разными профилями под Windows?</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2022/04/kak-odnovremenno-otkryt-neskolko-brauzerov-yandeks-s-raznymi-profilyami-pod-windows/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Как превратить таблицу в массив (PHP)</title>
		<link>https://www.lexium.ru/2021/08/kak-prevratit-tablicu-v-massiv-php/</link>
					<comments>https://www.lexium.ru/2021/08/kak-prevratit-tablicu-v-massiv-php/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Mon, 16 Aug 2021 13:00:23 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9715</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2019/06/sketch1561031677291-picsay-017770941136652558085-200x200.jpeg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" srcset="https://www.lexium.ru/images/2019/06/sketch1561031677291-picsay-017770941136652558085-200x200.jpeg 200w, https://www.lexium.ru/images/2019/06/sketch1561031677291-picsay-017770941136652558085-410x410.jpeg 410w, https://www.lexium.ru/images/2019/06/sketch1561031677291-picsay-017770941136652558085.jpeg 640w" sizes="auto, (max-width: 200px) 100vw, 200px" /><p>Дано: Форма с полем типа textarea, в которое методом копипаста (Ctrl-C Ctrl-V) вставляется содержимое таблице Excell. Нужно, превратить эти данные в двухмерный массив типа $arr[номер_строки][номер_ячейки]. Собственно, делалось это вот так. Т.е. дробим полученную строку по символам перевода каретки (\n), а то что раздробилось &#8212; дробим по символу табуляции (\t) и получаем массив $arr. function tableToArray($textarea) { $arrtr = explode(&#34;\n&#34;, $textarea); foreach ($arrtr as $k =&#62; $v) { $arr&#x5B;$k] = explode(&#34;\t&#34;,...</p>
The post <a href="https://www.lexium.ru/2021/08/kak-prevratit-tablicu-v-massiv-php/">Как превратить таблицу в массив (PHP)</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Дано: Форма с полем типа textarea, в которое методом копипаста (Ctrl-C Ctrl-V) вставляется содержимое таблице Excell.</p>
<p>Нужно, превратить эти данные в двухмерный массив типа $arr[номер_строки][номер_ячейки].<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<p>Собственно, делалось это вот так. Т.е. дробим полученную строку по символам перевода каретки (\n), а то что раздробилось &#8212; дробим по символу табуляции (\t) и получаем массив $arr.</p>
<pre class="brush: plain; title: ; notranslate">function tableToArray($textarea) {
	$arrtr = explode(&quot;\n&quot;, $textarea);
	foreach ($arrtr as $k =&gt; $v) {
		$arr&#x5B;$k] = explode(&quot;\t&quot;, $v);
	}
	return $arr;
}</pre>
<p>Ничто не предвещало беды, но, вмешался человеческий фактор. Кое-кто повадился ставить символы перевода каретки прямо в ячейках таблицы, и всё пошло по&#8230; лесу.</p>
<p>Пришлось усложнить алгоритм.</p>
<pre class="brush: plain; title: ; notranslate">function tableToArray($textarea) {
	//Делаем проверку первой строки. По ней считаем количество колонок в таблице
	$prearrtr = explode(&quot;\n&quot;, $textarea);
	$tdcount = count(explode(&quot;\t&quot;, $prearrtr&#x5B;0])) - 1; //Получаем номер последней ячейки для каждой строки
	$tabattr = explode(&quot;\t&quot;, $textarea); //Дробим данные по символу табуляции
	$forbiddenCharacters = &quot;\/*?&lt;&gt;|+%!\n\r&quot;; //Запрещённые символы
	$arr = &#x5B;];
	$trnum = 0;
	$tdnum = 0;
	foreach ($tabattr as $v) {
		if ($tdnum &lt; $tdcount) {
		//Если у нас не последняя ячейка
			$arr&#x5B;$trnum]&#x5B;$tdnum] = preg_replace(&quot;/&#x5B;${forbiddenCharacters}]/&quot;, '', $v);
			$tdnum++;
		}else{
			//Если ячейка последняя, то она содержит и первую ячейку следующей строки
			//Кроме того, и в первой и в последней ячейке могут быть ненужные переводы строк
			//Поэтому, бьём на массив, удаляем пустые ячейки, перенумеровываем.
			$finalv = array_values(array_diff(explode(&quot;\n&quot;, $v), array('')));
		
			//Пишем последнюю ячейку
			$arr&#x5B;$trnum]&#x5B;$tdnum] = preg_replace(&quot;/&#x5B;${forbiddenCharacters}]/&quot;, '', $finalv&#x5B;0]);
	
			$trnum++;
			$tdnum = 0;
			$arr&#x5B;$trnum]&#x5B;$tdnum] = preg_replace(&quot;/&#x5B;${forbiddenCharacters}]/&quot;, '', $finalv&#x5B;1]);
			$tdnum++;
		}
	}
	return $arr;
}</pre>
<p>Если смотреть в код, то в принципе алгоритм понятен. Есть пара моментов, которые поясню отдельно.</p>
<p>Первая строка таблицы (шапка) &#8212; эталонная и её никто не правит. Поэтому, в ней нет символов переходов строк. По ней считаем количество столбцов в таблице.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Дробим данные по табуляции и закидываем в массив $tabattr. Проблема в том, что последняя ячейка текущей строки сливается с первой ячейкой следующей и попадает в одну ячейку массива. Поэтому, дойдя до последней ячейки (по номеру $tdcount), я дроблю полученные данные по символу перевода каретки и получаю массив $finalv. Удаляю из $finalv пустые ячейки и перенумеровываю ключи.</p>
<p>Теперь, первую ячейку $finalv[0] загоняю в последнюю ячейку текущей строки массива таблицы, а вторую ячейку $finalv[1] закидываю в первую ячейку следующей строки.</p>
<div class="comment">А ещё, я чищу содержимое ячеек от символов, указанных в переменной $forbiddenCharacters. В т.ч. от символов перевода строки.</div>
<p>Собственно, на этом пока всё.</p>The post <a href="https://www.lexium.ru/2021/08/kak-prevratit-tablicu-v-massiv-php/">Как превратить таблицу в массив (PHP)</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2021/08/kak-prevratit-tablicu-v-massiv-php/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Калькулятор +- 1%</title>
		<link>https://www.lexium.ru/2021/08/kalkulyator-1/</link>
					<comments>https://www.lexium.ru/2021/08/kalkulyator-1/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Thu, 05 Aug 2021 15:09:31 +0000</pubDate>
				<category><![CDATA[Что я творю...]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9708</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2021/08/plusminus-200x200.jpg" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" srcset="https://www.lexium.ru/images/2021/08/plusminus-200x200.jpg 200w, https://www.lexium.ru/images/2021/08/plusminus.jpg 300w" sizes="auto, (max-width: 200px) 100vw, 200px" /><p>Заметил, что в приложениях по торговле акциями, с каждой сделки снимается комиссия 0.3%. Подвох в том, что комиссия снимается и с покупки, и с продажи. Покупаешь акцию за 1000 руб, а потом продаёшь за 1005 руб. Смотришь, а с тебя сняли примерно 6 рублей. Сделки-то было две: сначала покупка, потом продажа. И процент получился примерно 0.3+0.3. Это почти 0,6%, т.е. 6 рублей, но не совсем, ведь вторые 0.3% выплачиваются с...</p>
The post <a href="https://www.lexium.ru/2021/08/kalkulyator-1/">Калькулятор +- 1%</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<form id="birjcomprocent">
<p><input name="summa" type="text" /></p>
<p style="color:green;">Плюс 1%: <strong><span id="plus1procent">0</span></strong></p>
<p style="color:red;">Минус 1%: <strong><span id="minus1procent">0</span></strong></p>
</form><hr />
<p>Заметил, что в приложениях по торговле акциями, с каждой сделки снимается комиссия 0.3%. Подвох в том, что комиссия снимается и с покупки, и с продажи.</p>
<p>Покупаешь акцию за 1000 руб, а потом продаёшь за 1005 руб. Смотришь, а с тебя сняли примерно 6 рублей. Сделки-то было две: сначала покупка, потом продажа. И процент получился примерно 0.3+0.3. Это почти 0,6%, т.е. 6 рублей, но не совсем, ведь вторые 0.3% выплачиваются с большей суммы.</p>
<p><!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<p>Для себя я округлил комиссию до 1%. Таким образом, если купленная акция подорожала на 1%, её можно продать без убытка.</p>
<p>Этот калькулятор показывает введённую сумму, плюс 1% (и еще минус 1% от введённой суммы, если идёт игра на понижение). Разумеется, с округлением до сотых.</p>The post <a href="https://www.lexium.ru/2021/08/kalkulyator-1/">Калькулятор +- 1%</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2021/08/kalkulyator-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>How to force test fail in Codeceptjs (или как принудительно зафейлить тест)</title>
		<link>https://www.lexium.ru/2021/01/how-to-force-test-fail-in-codeceptjs-ili-kak-prinuditelno-zafejjlit-test/</link>
					<comments>https://www.lexium.ru/2021/01/how-to-force-test-fail-in-codeceptjs-ili-kak-prinuditelno-zafejjlit-test/#respond</comments>
		
		<dc:creator><![CDATA[Doctor Lexium]]></dc:creator>
		<pubDate>Wed, 20 Jan 2021 10:28:56 +0000</pubDate>
				<category><![CDATA[Блог]]></category>
		<guid isPermaLink="false">https://www.lexium.ru/?p=9664</guid>

					<description><![CDATA[<img width="200" height="200" src="https://www.lexium.ru/images/2021/01/ccjs-200x200.png" class="attachment-thumbnail size-thumbnail wp-post-image" alt="" style="float:left; margin:0 10px 10px 0;" decoding="async" loading="lazy" /><p>Тестирую приложение с помощью Codeceptjs. Столкнулся с необходимостью принудительно завершить тест с ошибкой по условию. Самый простой и рабочий вариант &#8212; писать в шаг вот такую строчку. require(&#34;assert&#34;).fail(&#34;Test failed&#34;); Вроде на этом можно было бы успокоиться. Но нет! Захотелось красоты. Чтобы написал в нужном месте I.fail(&#8216;Текст ошибки&#8217;), и тест завершился. Пробовал через добавление метода в steps_file.js, но ничего не вышло. Нужно действовать через хелпер. Ну и ладно. 1. Иду в...</p>
The post <a href="https://www.lexium.ru/2021/01/how-to-force-test-fail-in-codeceptjs-ili-kak-prinuditelno-zafejjlit-test/">How to force test fail in Codeceptjs (или как принудительно зафейлить тест)</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></description>
										<content:encoded><![CDATA[<p>Тестирую приложение с помощью Codeceptjs. Столкнулся с необходимостью принудительно завершить тест с ошибкой по условию.</p>
<p>Самый простой и рабочий вариант &#8212; писать в шаг вот такую строчку.<br />
<!-- Yandex.RTB --><script>window.yaContextCb=window.yaContextCb||[]</script><script src="https://yandex.ru/ads/system/context.js" async></script><!-- Yandex.RTB R-A-249757-2 --></p>
<div class="abzac_two">
<div id="yandex_rtb_R-A-249757-2"></div>
</p></div>
<p>		<script>
		window.setTimeout(function() {
			window.yaContextCb.push(()=>{
				Ya.Context.AdvManager.render({
					"blockId": "R-A-249757-2",
					"renderTo": "yandex_rtb_R-A-249757-2"
				})
			});
		}, 5000);
		</script></p>
<pre class="brush: plain; title: ; notranslate">require(&quot;assert&quot;).fail(&quot;Test failed&quot;);</pre>
<p>Вроде на этом можно было бы успокоиться. Но нет! Захотелось красоты. Чтобы написал в нужном месте I.fail(&#8216;Текст ошибки&#8217;), и тест завершился.</p>
<p>Пробовал через добавление метода в steps_file.js, но ничего не вышло. Нужно действовать через хелпер. Ну и ладно.</p>
<p>1. Иду в папку с тестами и создаю в ней ещё одну &#8212; helpers.&nbsp; Создаю в ней файл &#8212; fail.js</p>
<p>2. Пихаю в fail.js класс с одним единственным методом &#8212; fail.</p>
<pre class="brush: plain; title: ; notranslate">/*
 * Принудительное зафейливание тестов.
 */
const assert = require('assert');
class Failer extends Helper {
   /**
   * @param {string} &#x5B;message]
   */
    fail(message = 'Test failure.') {
        assert.fail(message);
    }
}
module.exports = Failer;</pre>
<p>3. Добавляю хелпер в конфиг.</p>
<pre class="brush: plain; title: ; notranslate">  helpers: {
    ...
    Failer: {
        require: &quot;./helpers/fail.js&quot;
    }
    ...
</pre>
<p>4. Готово.</p>
<div class="donate_tea"><a class="donate_tea_button" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Помогло? Зашли админу на чай с печеньками</a></p>
<div class="top10_wrapper">
<div class="track">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Евгений С &#8212; 700 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Stand Alone &#8212; 500 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Вадим Ворон &#8212; 108 RUB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vyazik &#8212; 50 RUB</div>
</div>
<p><a class="donate_tea_button thanckyou_w" href="https://www.donationalerts.com/r/alexcube" rel="nofollow" target="_blank" title="Зашли админу на чай с печеньками">Большое спасибо!</a></div>
<p>Теперь, я могу красиво зафейлить тест на любом шаге.</p>
<p><a href="https://www.lexium.ru/images/2021/01/fail.png" data-rel="lightbox-image-0" data-rl_title="" data-rl_caption="" title=""><img loading="lazy" decoding="async" class="alignnone size-full wp-image-9665" src="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7" sleepsrc="https://www.lexium.ru/images/2021/01/fail.png" alt="" width="204" height="54"></a></p>
<p>Мне удобно)) Возможно, пригодится и вам.</p>
<p>&nbsp;</p>The post <a href="https://www.lexium.ru/2021/01/how-to-force-test-fail-in-codeceptjs-ili-kak-prinuditelno-zafejjlit-test/">How to force test fail in Codeceptjs (или как принудительно зафейлить тест)</a> first appeared on <a href="https://www.lexium.ru">Доктор Лексиум</a>.]]></content:encoded>
					
					<wfw:commentRss>https://www.lexium.ru/2021/01/how-to-force-test-fail-in-codeceptjs-ili-kak-prinuditelno-zafejjlit-test/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
