Мы не владеем тем, чего мы не понимаем RSS 2.0
 Tuesday, May 27, 2008

Crimea 2008 - фотоотчет с похода на Басман и Кемаль-Эгерек


Tuesday, May 27, 2008 12:45:56 PM (FLE Standard Time, UTC+02:00)  #    Comments [1] - Trackback
News | Photography
 Monday, May 26, 2008

Давно не писал, исправлюсь..

В ближайщем времени напишу пару заметок о Silverlight 2 beta1 и LINQ, но прежде обработаю и выложу фотографии с похода.

Monday, May 26, 2008 5:47:08 PM (FLE Standard Time, UTC+02:00)  #    Comments [1] - Trackback
News
 Wednesday, April 23, 2008

Предстаим ситуацию: мы разрабатываем компонент ASP.NET, например color picker. Мы написали JavaScript, который отображает табличку для выбора цвета, и добавили ASP.NET TextBox, в который будет записыватся выбранный цвет. Но нам бы не хотелось позволять пользователю менять значение цвета вручную (да и зачем, у нас и так есть picker, над которым мы так трудились ;)).

И мы ставим у TextBox значение проперти ReadOnly в true. Пришло время использовать наш супер-пикер. Бросаем его на страницу, выбираем цвет, и отправляем форму на сервер, и.. Oh My God! Где же выбранное значение? Почему свойство Text пустое?!

Где-то так было у меня.. Но все от незнания (или от плохой памяти... ).

Вот что говорит MSDN по этому поводу:

The Text value of a TextBox control with the ReadOnly property set to true is sent to the server when a postback occurs, but the server does no processing for a read-only text box. This prevents a malicious user from changing a Text value that is read-only. The value of the Text property is preserved in the view state between postbacks unless modified by server-side code.


Так что будьте на чеку :), чтобы это не стало сюрпризом и не вылилось в несколько часов поисков «а где же мое значение».

Wednesday, April 23, 2008 11:36:20 AM (FLE Standard Time, UTC+02:00)  #    Comments [0] - Trackback

 Friday, April 18, 2008

Наверное уже все, кто использовал Silverlight 1.0, опробовали новые возможности, новые компоненты из Silverlight v2 beta 1. Но когда же ждать final релиза?

Вот приблизительный roadmap (из непроверенных источников J):

We are targeting late Summer

Here is a rough timeline:
Silverlight 2.0 Beta 1 (Q1CY08 with limited (non commercial) Go-Live)
Silverlight 2.0 Beta 2 (Q2CY08 with Go-Live)
Silverlight 2.0 RTM (Summer 2008) – Exact timing TBD

Silverlight v.next – We are working on a v.Next plan and have nothing to announce at this time

Silverlight for mobile – No date available

Friday, April 18, 2008 4:01:09 PM (FLE Standard Time, UTC+02:00)  #    Comments [0] - Trackback
Silverlight
 Tuesday, March 25, 2008

Корпорация Microsoft опубликовала предупреждение для пользователей редактора Word об уязвимости текстового процессора. Используя ее, хакеры могут получить несанкционированный доступ к ПК жертвы и выполнить на нем произвольный код.

Проблема связана с компонентом Jet Database Engine. Он используется в пакете MS Office, в том числе в программах Word и Access. Для осуществления атаки киберпреступник должен создать файл в формате .doc, который при открытии в любой программе, работающей с такими файлами, провоцирует ошибку в msjet40.dll, а она позволяет выполнить произвольный код на ПК. Специалисты Microsoft отмечают эту особенность атаки через файлы .doc как «смягчающие обстоятельства», поскольку злоумышленнику необходимо разместить зараженный файл в Сети и «заставить» жертву скачать его, а затем открыть.

В сообщении компании говорится, что от уязвимости могут пострадать пользователи программ Microsoft Word 2000 SP3, Microsoft Word 2002 SP3, Microsoft Word 2003 SP2, Microsoft Word 2003 SP3, Microsoft Word 2007 и Microsoft Word 2007 SP1, работающих на базе ОС Microsoft Windows 2000, Windows XP или Windows Server 2003 SP1. Проблема не касается версий Windows Server 2003 SP2, Windows Vista и Windows Vista SP1. В данный момент специалисты Microsoft занимаются решением проблемы. О сроках выпуска патча в бюллетене ничего не говорится.

Тем временем, специалисты Microsoft уже сообщили, что знают о первых атаках с помощью данной уязвимости. Однако в корпорации полагают, что риски небольшие, а пользователям до выпуска патча необходимо проявлять осторожность — не скачивать и не открывать файлы в формате .doc с незнакомых или подозрительных веб-ресурсов, а также получаемые по электронной почте от адресатов, не вызывающих доверия.

Tuesday, March 25, 2008 12:36:03 PM (FLE Standard Time, UTC+02:00)  #    Comments [1] - Trackback

 Sunday, March 02, 2008

Содержание:

1. Введение
2. Установка
3. Создание тестов с помощью ArtoOfTest WebAii
4. Конфигурирование тестов
5. Первый тест
6. Работаем с AJAX
7. Поиск элементов и автосгенерированные Id элементов в ASP.NET

Введение

Итак, закомимся – WebAii – framework для автоматизированного тестирования web приложений. Сайт разработчиков: http://www.artoftest.com.
Что же предлагает WebAii:

  • Автоматизация с использованием событий DOM, или вызов событий клавитуры/мыши напрямую (клики, перетаскивание и прокрутка, ввод текста).
  • Подежка приложений Ajax и JavaScript Unit-testing.
  • Возможность поиска элементов на странице с возможностью указания «упрощенных» названий элементов для упрощения поиска их на странице.
  • Реализация DOM-модели в .NET, что дает возможность навигации по элементам из кода тестового модуля.
  • Поддержка NUnit и Visual Studio Team Test шаблонов и расширений.
  • Поддержка visual capturing элементов и состояний браузера.
  • А также многие другие полезные возможности, облегчающие процесс тестирования и написания unit-тестов (TestRegions, HTML popups, frames support, etc).
  • Большое количество примеров использования.

Установка

Для того, чтобы скачать WebAii, необходимо зарегистрироватся у них на форуме. Ну что ж, регистрируемся, качаем. Далее устанавливаем:

Установка проходит простыми нажатиями Next в инсталяторе J.
После установки заглянем в папку, в которую мы поставили WebAii.


Подробно о назначении каждой сборки я расказывать не буду. Просто отмечу что главной сборкой является ArtoOfTest.WebAii.dll, которая является ядром test framework, и в которой собраны такие важные классы, как Settings, Manager, Browser, Find и т. д.
Замечу что в это папке находится add-in для FireFox, который тоже необходимо установить. Откройте FireFox и просто перетяните файл webaii@artoftest.com.xpi в окно FireFox, дождитесь пока станет активной кнопка Install Now и нажмите ее, все, add-in готов к использованию:

Создание тестов с помощью ArtoOfTest WebAii.

В этом примере я раскажу как использовать WebAii в Visual Studio Team Test / Team Suite. Использование WebAii совместно с NUnit описано здесь.
Итак, запускаем Visual Studio, и создаем новый проект теста: File -> New -> Project. В дереве: Visual C# -> Test -> Test Project.

После создания проекта, удаляем все созданные автоматически файлы (мы будем использовать темплейты, которые были установлены, при установке WebAii). Для этого нажимаем правой кнопкой на проекте и выбираем Add -> New Item .. а в появившемся окне ищем WebAii VsUnit Test, даем «человеческое» имя файлу теста и жмем Add.

Все, шаблон «готов к употреблению».
Здесь на минутку остановимся и взглянем на базовый класс нашего Unit Test – BaseVsUnitTest. В нем есть несколько полезных, часто используемых свойств: Manager, Settings, Browser, Desktop, Log, Find, которые используются чаще всего, при этом они уже есть (как видим в базовом классе, и нам не прийдется заботится об их создании/инициализации) .

using ArtOfTest.WebAii.Core;
using System;

namespace ArtOfTest.WebAii.TestTemplates
{
   
public abstract class BaseVsUnitTest 
   

       
protected BaseVsUnitTest(); 
        
       
public Actions Actions { get; } 
       
public Browser ActiveBrowser { get; } 
       
public Desktop Desktop { get; } 
       
public Find Find { get; } 
       
public Log Log { get; } 
       
public Manager Manager { get; } 

       
public void CleanUp(); 
       
public static Settings GetSettings(); 
       
public void Initialize(); 
       
public void Initialize(string logLocation); 
       
public void Initialize(TestContextWriteLine vsWriteLineDelegate); 
       
public void Initialize(Settings settings, TestContextWriteLine vsWriteLineDelegate); 
       
public void Initialize(string logLocation, TestContextWriteLine vsWriteLineDelegate); 
       
public void SetTestMethod(object testObject, string testMethodName); 
   
}
}

Конфигурирование тестов

Вместо того, чтобы конфигурировать тест из кода, в WebAii существует возможность конфигурирования с помощью файла конфигурации App.config. Возьмем за основу ранее созданный проект (или скачиваем его здесь) и добавим к нему файл конфигурации. Жмем правой кнопкой мыши на пректе и выбираем Add -> New Item .. а в диалоге выбираем "Application Configuration File" -> жмем Add.

После чего файл конфигурации будет добавлен в проект. Теперь мы можем добавить секцию конфигурации. Открываем App.config файл. Выглядеть он должен где-то так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
</configuration>

Для начала зарегистрируем конфигурационную секцию WebAii.Settings. Для этого, внутри элемента configuration добаляем новый элемент configSections, в котором регистрируем секцию WebAii.Settings.

<configuration
   
<configSections
       
<section name="WebAii.Settings" type="ArtOfTest.WebAii.Core.SettingsConfigSectionHandler,ArtOfTest.WebAii, Version=1.0.600.0, Culture=neutral, PublicKeyToken=4fd5f65be123776c" /> 
    
</configSections>
</configuration>

А затем добавляем саму конфигурацию (ниже, под элементом /configSections). Всё вместе это должно выглядеть следующим образом:

<?xml version="1.0" encoding="utf-8" ?> 
   
<configuration>
       
<configSections
           
<section name="WebAii.Settings" type="ArtOfTest.WebAii.Core.SettingsConfigSectionHandler,ArtOfTest.WebAii, Version=1.0.600.0, Culture=neutral, PublicKeyToken=4fd5f65be123776c" /> 
       
</configSections
       
<WebAii.Settings 
           
annotateExecution="false" 
            
baseUrl=http://www.testserver.net/ 
           
clientReadyTimeout="50000" 
           
defaultBrowser="InternetExplorer"             
           
enableScriptLogging="false" 
           
enableUILessRequestViewing="false" 
           
executionDelay="0" 
           
executionTimeout="60000" 
           
localWebServer="None" 
           
logLocation="C:\WebAiiLog\" 
           
queryEventLogErrorsOnExit="false" 
           
scriptLoggingPort="8099" 
           
simulatedMouseMoveSpeed="0.5" 
           
webAppPhysicalPath="" />
   
</configuration>

К сожалению, ArtOfTest не поставляет XSD схему для своей секции, следовательно Intellisence отсутствует при редактровании секции WebAii.Settings. Более подробно о свойствах WebAii.Setting можно узнать здесь, я же отмечу наиболее важные/полезные настройки:

  • baseUrl – указывает базовый URL приложения, если эта опция указана, то при использовании методов NavigateTo() надо указывать относительные пути (довольно удобно, если предполагается, что тест должен работать вне зависимости от того, где находится сайт)ю
  • clientReadyTimeout – время ожидания клиента (при тестировании во время разработки на локальном сервере и при прогоне тестов на продакшене, время отклика может оказатся разным).
  • defaultBrowser – Браузер по умолчанию, в котором будет выполнен тест (по умолчанию Internet Explorer).

Первый тест

Пришло время сделать первый тест. Сделаем его очень простым (как делают приложения "Hello, World", когда начинают изучать язык программирования).

Для начала, в метод, помеченный атрибутом [TestInitizalize()] добавим следующий код:

if (Manager.Browsers.Count == 0)

   
Manager.LaunchNewBrowser();
}

Это позволит при запуске каждого теста проверять, существует ли запущенный браузер, и запускать новый, если нет запущенных.
А теперь наш Hello, World.

[TestMethod]
public void FirstTestMethod() 

   
Manager.ActiveBrowser.NavigateTo(http://google.com/); 

    // Insert "Hello, World" to seach field. 
   
HtmlInputText searchField = Find.ByAttributes<HtmlInputText>("name=\"q\""); 
   
searchField.Text = "Hello, World";

    // Find search button and click. 
   
HtmlInputSubmit submit = Find.ByName<HtmlInputSubmit>("btnG"); 
   
submit.Click();

    // Wait till browser gets ready. 
   
Manager.ActiveBrowser.WaitUntilReady(); 
   
HtmlInputText searchField2 = Find.ByAttributes<HtmlInputText>("name=\"q\"");

    Assert.AreEqual(searchField.Text, searchField2.Text);
}

Простой тест, позволяющий проверить, работает ли Google J. Все довольно просто: открываем браузер, открываем страницу поиска Google, ищем поле ввода по имени (name = "q") и кнопку поиска, указываем, что хотим искать "Hello, World", и жмем на кнопку, проверяем, что в поле поиска осталось значение ("Hello, World"), которое мы искали. Пример можно скачать здесь.
А теперь о плохом:
Иногда можно получить следующую ошибку: ArtOfTest.WebAii.Exceptions.ExecuteCommandException
Это по всей видимости проиходит потому, что браузер не готов выполнять посланные команды, в часности, NavigateTo, поэтому, если такое возникает, добавьте в начало теста строку ожидания браузера (пока он не перейдет в состояние ready)
Manager.ActiveBrowser.WaitUntilReady();

Работаем с AJAX

Первое впечатление при попытке подружить WebAii и AJAX было – «не работает». Проверим так ли это. Создадим простое Web-приложение, которое использует ASP.NET AJAX.

Замечание:
В дальнейшем предполагается, что ASP.NET AJAX установлен.
Для этого выбираем File -> Add -> New Web Site. Из предложенных вариантов выбираем ASP.NET AJAX-Enabled Web Site и «поселяем» новый веб-сайт в IIS: выбираем
- Location: HTTP
- Language: Visual C#
- Жмем Browse и создаем приложение/виртуальную директорию, к которой будет находится сайт

Далее, сделаем простой пример с применением AJAX. Это немного выходит за рамки темы даного поста, поэтому чтобы чтобы не делать все описанное ниже, можно просто скачать демо-проект и разместить его в IIS.
Итак, добавим на страницу для начала компонент UpdatePanel (тем самым обеспечив асинхронное обновление части страницы). Внутрь UpdatePanel поместим Label и Button, при клике на последнюю, будем асинхронно обновлять надпись в Label.

Исходный код ASPX (Default.aspx):

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <
title>Untitled Page</title
</head>

<body
   
<form id="form1" runat="server"> 
       
<asp:ScriptManager ID="ScriptManager1" runat="server" /> 
           
<div
               
<asp:UpdatePanel runat="server" ID="demoUpdatePanel"> 
                   
<ContentTemplate
                       
<asp:Label runat="server" ID="lblTitle"></asp:Label
                       
<br /> 
                       
<asp:Button runat="server" ID="btnGo" Text="Press to go!" 
                            OnClick="OnGoButtonClick" /> 
                   
</ContentTemplate
               
</asp:UpdatePanel
           
</div
   
</form>
</body>
</html>

Исходный код code-behind (Default.aspx.cs):

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page

    protected void Page_Load(object sender, EventArgs e) 
   

   


   
protected void OnGoButtonClick(object sender, EventArgs e) 
   

       
this.lblTitle.Text = "Async GO"
    }
}


Вот такое простое web-приложение получилось. Запускаем, жмем кнопку "Press to go!" и убеждаемся, что приложение работает асинхронно, и окно браузера не перерисовается полностью (а только меняется надпись).

Приложение есть, и оно работает используя ASP.NET AJAX. Пришло время протестировать его. Снова воспользуемся ранее созданным проектом BaseWebAiiProject (в котором мы тестировали Google). Открываем файл FirstTest.cs, находим в нем FirstTestMethod() и под ним добавляем следующий метод:

[TestMethod]
public void TestAjaxApplication()

   
Manager.ActiveBrowser.WaitUntilReady();
}

В этот метод будет добавлен код, которым мы проверим, как изменилось состояние надписи после нажатия на кнопку.
Прежде чем написать сам тест, отмечу, что в WebAii, а точнее у класса Actions, существует метод, с помощью которого можно ждать измения состояния элементов страницы – WaitForEment(FindParam, waitTimeout, invertCondition [optional]).
Пример...

[TestMethod]
public void TestAjaxApplication()

   
Manager.ActiveBrowser.WaitUntilReady(); 
   
Manager.ActiveBrowser.NavigateTo("~/TestAjax/Default.aspx"); 

   
// Check intial state. 
   
HtmlSpan label1 = Find.ById<HtmlSpan>("lblTitle"); 
   
Assert.AreEqual(string.Empty, label1.InnerText);

    // Search for "go" button. 
   
HtmlInputSubmit goButton = Find.ByName<HtmlInputSubmit>("btnGo"); 
   
goButton.Click();

    FindParam seachParam = new FindParam("id=\"lblTitle\"", "innerText=\"\"");
    Manager.ActiveBrowser.Actions.WaitForElement(seachParam, 500, true);

    HtmlSpan label2 = Find.ById<HtmlSpan>("lblTitle"); 
   
string text = label2.InnerText; 
   
Assert.AreEqual("Async GO", text);
}

.. и объяснения: для начала находим элемент span (наш asp:Label), и проверяем его innerText, убеждаемся что он равен «», затем нажимаем кнопку и ждем пока изменится состояние описанное в FindParam. Замечу, что в FindParam можно указывать несколько условий, по которым будет производится поиск. В нашем случае – ищем кнопку с id = "lblTitle" и аттрибутом innerText = "". Учитывайте, что WaitForElement будет «ждать» элемент 500ms (столько, сколько ему «сказали» ждать), и по истечению этого периода времени выполнение теста будет продолжено.

Поиск элементов и автосгенерированные Id элементов в ASP.NET.

Учитывая то, что в ASP.NET идентификаторы элементов создаются автоматически, то прямой поиск по id = "myButton" не удастся, т.к. в HTML этот Id для кнопки ASP.NET будет преобразован, например в такой ID: GridView1$ctl07$myButton. Как же делать поиск в таком случае? К сожалению Find.ById не поддерживает регулярные выражения (что бы в значительной мере облегчило жизнь), но существует такой метод как FindCustom, где можно указывать предикаты поиска.
Пример:

[TestMethod]
public void FindCustomTest()

   
Manager.ActiveBrowser.WaitUntilReady(); 
   
Manager.ActiveBrowser.NavigateTo("~/TestAjax/Default.aspx");

    // Original control ID within DOM is GridView1$ctl02$myButton. 
   
IdSearch searchPredicate = new IdSearch("myButton"); 
   
HtmlInputSubmit myButton = Find.ByCustom<HtmlInputSubmit>(searchPredicate.Search); 
   
Assert.AreEqual("Do", myButton.Value); 
}

Далее, если посмотреть в отладчике, на тест с использованием предиката, то можно увидеть следующее

Таким образом, указывая только часть имени и используя предикаты поиска, можно искать элементы с Id, автосгенерированными ASP.NET. Пример, и класс предиката, можно скачать здесь.

На этом пожалуй и все. Happy coding.

Sunday, March 02, 2008 7:42:04 PM (FLE Standard Time, UTC+02:00)  #    Comments [0] - Trackback
.NET | ASP.NET | Testing
 Wednesday, February 27, 2008

Иногда возникает необходимость определить, является ли введенный/выбранный (например, из списка) пользователем год високосным.
В C# все просто:
bool isLeap = DateTime.IsLeapYear(1996);

Но, в JavaScript такого нет, к сожалению. Но вискосный год или нет, можно определить, используя следующую функцию:

function IsLeapYear(year) {
    if(year%4 == 0) {
        if(year%100 == 0) {
            if(year%400 == 0) {
                return true;
            }
            else
                return false;
        }
        else
            return true;
    }
    return false;
}

 

Анализируя функцию, возникает вопрос: а не проще ли сделать year%4 == 0 и получить високосный год. Ответ: нет. Алгоритм вычисления высокосного года немного сложнее (поблагодарим Папу Георгия ХIII). Год считается високосным только в том случае если он делится на 4 без остатка (это мы знаем со школы), но при этом не делится на 100 без остатка, или, если делится на 100, должен делится и на 400 без остатка.

Happy coding.

Wednesday, February 27, 2008 2:17:28 PM (FLE Standard Time, UTC+02:00)  #    Comments [0] - Trackback
JavaScript
 Tuesday, February 19, 2008

С 31 марта 2008 Microsoft перестанет поддерживать 22 сертификационных экзамена, в основном касающихся Windows NT 4.0, Windows 2000 и Exchange Server 2000. Более подробно – здесь.

Tuesday, February 19, 2008 3:02:47 PM (FLE Standard Time, UTC+02:00)  #    Comments [0] - Trackback

Navigation
Archive
<May 2008>
SunMonTueWedThuFriSat
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567
Blogroll
Visitors:
 
Locations of visitors to this page
My LinkedIn profile:
 
logo
About the author/Disclaimer

Disclaimer
The opinions expressed herein are my own personal opinions and do not represent my employer's view in any way.

© Copyright 2010
FLUID
Sign In
Statistics
Total Posts: 20
This Year: 0
This Month: 0
This Week: 0
Comments: 7