🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ напишСм Π΄Π²Π° скрипта, Ρ€ΠΈΡΡƒΡŽΡ‰ΠΈΡ… смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-вСрсии Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ инструмСнта для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ дСйствий Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Selenium.
🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium

Когда Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΡˆΡŒ тСстировщиком, Π±Ρ‹Π²Π°Π΅Ρ‚ Π½Π΅ знаСшь, ΠΊΠ°ΠΊΡƒΡŽ Π·Π°Π΄Π°Ρ‡Ρƒ Ρ‚Π΅Π±Π΅ ΠΏΠΎΠ΄ΠΊΠΈΠ½Π΅Ρ‚ Π½ΠΎΠ²Ρ‹ΠΉ дСнь. ΠœΠΎΠΆΠ΅Ρ‚, это Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Π³Ρ€ΡƒΠ·ΠΎΡ‡Π½ΠΎΠ΅ тСстированиС, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° отказоустойчивости ΠΈΠ»ΠΈ появится Π½Π°Π΄ΠΎΠ±Π½ΠΎΡΡ‚ΡŒ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ скрипт для гСнСрирования Π΄Π°Π½Π½Ρ‹Ρ….

Π’ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ΡΡ интСрСсныС ΠΈ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ. Одной ΠΈΠ· Ρ‚Π°ΠΊΠΈΡ… Π·Π°Π΄Π°Ρ‡ являСтся взаимодСйствиС Π² UI c нСстандартными элСмСнтами. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π΅ΠΌ Π·Π°Π΄Π°Ρ‡Ρƒ, которая Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд каТСтся слоТной, Π½ΠΎ Π½Π° Π΄Π΅Π»Π΅ оказываСтся достаточно простой. ΠŸΡƒΡΡ‚ΡŒ ΠΎΠ½Π° Π±ΡƒΠ΄Π΅Ρ‚ Π·Π²ΡƒΡ‡Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ: Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ½Π»Π°ΠΉΠ½-вСрсии ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Paint простой рисунок.

β˜• ΠŸΠΎΠ΄Ρ‚ΡΠ½ΡƒΡ‚ΡŒ свои знания ΠΏΠΎ Java Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Java для собСса»

Боставим ΠΏΠ»Π°Π½ выполнСния Π·Π°Π΄Π°Ρ‡ΠΈ:

  1. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Online Paint.
  2. ΠΠ°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ рисунок.
  3. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€.

ΠŸΠ΅Ρ€Π΅Π΄ Ρ‚Π΅ΠΌ ΠΊΠ°ΠΊ ΠΏΠΈΡΠ°Ρ‚ΡŒ сам тСст, Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅. Π­Ρ‚ΠΎ достаточно рутинная Π·Π°Π΄Π°Ρ‡Π° ΠΏΡ€ΠΈ создании Π½ΠΎΠ²Ρ‹Ρ… тСстов ΠΈΠ»ΠΈ тСстовых ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², поэтому Π½Π΅ Π±ΡƒΠ΄Ρƒ Ρ€Π°ΡΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ Π΄ΠΎΠ»Π³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ окруТСния ΠΊ написанию UI тСста Π½Π° Selenium, Π° ΡΠΎΡΡ‚Π°Π²Π»ΡŽ Ρ‡Π΅ΠΊ-лист, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π·Π°Π±Ρ‹Π»ΠΈ (добавлю Ρ‚ΠΎΠ»ΡŒΠΊΠΎ, Ρ‡Ρ‚ΠΎ Π² этот Ρ€Π°Π· ΠΌΡ‹ напишСм скрипт Π½Π° языкС программирования Java ΠΈ, соотвСтствСнно, ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ создадим для Π½Π΅Π³ΠΎ):

  1. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Selenium ΠΈ Junit Π² pom file:
            <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.141.59</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    

2. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ дистрибутив Selenium Π² main/resources (Π² этом тСстС Ρƒ мСня chromdriver):

🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium

3. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ дистрибутива (для удобства вынСсу Π² @Before):

            @Before
    public void start(){
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PAGE_LOAD_STRATEGY, "eager");
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--disable-extensions");
        System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver");
        options.addArguments("--start-maximized");
        options.addArguments("--remote-debugging-port=9222");
        driver = new ChromeDriver(options);
    }
    

4. ΠΠ°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄ закрытия WebDriver:

            @After
    public void stop(){
        driver.quit();
        driver = null;
    }

    

ΠžΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ приступим ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ. ΠžΡ‚ΠΊΡ€ΠΎΠ΅ΠΌ сайт https://jspaint.app/ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Π½Π΅Π»ΠΈ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° посмотрим, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ это Π·Π° элСмСнт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° сайтС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ прСдстоит Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ.

🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium

ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, это canvas. Canvas – элСмСнт HTML5, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹ΠΉ для создания растрового Π΄Π²ΡƒΡ…ΠΌΠ΅Ρ€Π½ΠΎΠ³ΠΎ изобраТСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ скриптов, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π° языкС JavaScript.

Для ΠΏΡ€ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π° напишСм сначала простой тСст для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ способов взаимодСйствия с элСмСнтом:

            @Test
    public void simplePaint(){
        driver.get("https://jspaint.app/");
         WebElement canvas = driver.findElement(By.xpath("//canvas[@class='main-canvas']"));

         driver.findElement(By.xpath("//div[@title='ΠšΠΈΡΡ‚ΡŒ']/span")).click();

        Actions builder = new Actions(driver);
        builder.clickAndHold(canvas).moveByOffset(0, -100).
                moveByOffset(-100,0).
                moveByOffset(0,100).
                moveByOffset(100,0).release().perform();
    }
    

ΠŸΡ€ΠΎΠ±Π½Ρ‹ΠΉ тСст ΠΏΡ€ΠΎΡˆΠ΅Π» Π»Π΅Π³ΠΊΠΎ. Π•Π³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π½Π° gif-ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ:

🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium
Π‘ΠΎΠ»ΡŒΡˆΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π²Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅ Π½Π° нашСм Ρ‚Π΅Π»Π΅Π³Ρ€Π°ΠΌ-ΠΊΠ°Π½Π°Π»Π΅ Β«Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° тСстировщика».

Π’Π΅ΠΏΠ΅Ρ€ΡŒ услоТним Π·Π°Π΄Π°Ρ‡Ρƒ – нарисуСм смайлик.

Π¨Π°Π³ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² тСстС:

  1. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΡŒ Online Paint.
  2. ΠΠ°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик.
  3. Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ.

Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ тСстС ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π»ΠΈ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, двигая ΠΏΠ΅Ρ€ΠΎΠΌ ΠΏΠΎ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Π°ΠΌ. ΠΠ°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Ρ‚Π°ΠΊΠΈΠΌ способом Π½Π΅ Ρ‚Π°ΠΊ просто. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ способ взаимодСйствия с этим элСмСнтом ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ‚ΠΎΠ³ΠΎΠ²ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ JavascriptExecutor. JavascriptExecutor – это интСрфСйс Selenium, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ с HTML DOM Π²Π΅Π±-страницы ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ это, выполняя ΠΊΠΎΠ΄ Π½Π° JavaScript. Π’Π°ΠΊΠΎΠΉ способ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ускоряСт выполнСния тСста, Π½ΠΎ тСряСтся полная ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΠΎΡΡ‚ΡŒ дСйствиям ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. ЯвляСтся Π»ΠΈ это плюсом ΠΈΠ»ΠΈ минусом – Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π²Π°ΠΌ. Π’ любом случаС использованиС JavascriptExecutor ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ³ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… тСстах, поэтому ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

По Π½Π°ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΌΡƒ ΠΏΠ»Π°Π½Ρƒ получаСтся Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:

         @Test
    public void paintSmile(){
// ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ сайт ΠΎΠ½Π»Π°ΠΉΠ½ ΠΏΠ΅ΠΉΠ½Ρ‚Π°
        driver.get("https://jspaint.app/");
// рисуСм смайлик
        if (driver instanceof JavascriptExecutor) {
            ((JavascriptExecutor)driver).executeScript("var canvas = document.getElementsByClassName(\"main-canvas\");\n" +
                    "console.log(canvas);" +
                    "ctx.beginPath();"+
                    "ctx.arc(75,75,50,0,Math.PI*2,true);"+
                    "ctx.moveTo(110,75);"+
                    "ctx.arc(75,75,35,0,Math.PI,false);"+
                    "ctx.moveTo(65,65);"+
                    "ctx.arc(60,65,5,0,Math.PI*2,true);"+
                    "ctx.moveTo(95,65);"+
                    "ctx.arc(90,65,5,0,Math.PI*2,true);"+
                    "ctx.stroke();");
        } else {
            throw new IllegalStateException("This driver does not support JavaScript!");
        }
// сохраняСм ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ
        driver.findElement(By.xpath("//div[@class='menu-button Ρ„Π°ΠΉΠ»-(f)-menu-button']")).click();
        driver.findElement(By.xpath("//tr[3]")).click();
        driver.findElement(By.xpath("//button[.='Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ']")).click();
    }

    

ПослС выполнСния тСста ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ:

🎨 Как Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ смайлик ΠΈ ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ Π² ΠΎΠ½Π»Π°ΠΉΠ½-Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π΅ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Paint с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Selenium

Оказалось, Π½Π°Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² ΠΎΠ½Π»Π°ΠΉΠ½-ΠŸΠ΅ΠΉΠ½Ρ‚Π΅ нСслоТно. НуТно всСго-Ρ‚ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, с ΠΊΠ°ΠΊΠΈΠΌ элСмСнтом Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ этого взаимодСйствия.

Π’Ρ‹Π²ΠΎΠ΄Ρ‹

Π‘Π°ΠΌΡ‹Π΅ Π½Π΅ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ – самыС интСрСсныС. Но ΠΈ ΠΎΠ½ΠΈ всСгда Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΏΠΎ шагам. Если Π΄Π΅ΠΊΠΎΠΌΠΏΠΎΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡Ρƒ, Ρ‚ΠΎ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ облСгчаСтся. Π”Π°, Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΡΡ‚Π°Π»ΠΊΠΈΠ²Π°Π΅ΡˆΡŒΡΡ с ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌΠΈ трудностями, Π½ΠΎ это Ρ‚ΠΎΠ³ΠΎ стоит. Врудности Π·Π°ΠΊΠ°Π»ΡΡŽΡ‚. Π£Π΄Π°Ρ‡ΠΈ!

ΠœΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹ ΠΏΠΎ Ρ‚Π΅ΠΌΠ΅

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию
Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ C++
Москва, ΠΏΠΎ ΠΈΡ‚ΠΎΠ³Π°ΠΌ собСсСдования

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•