Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Design, Quality, Testing > как писать тесты на Selenium


Автор: ОВиталий 24.10.2008, 16:07
кто нибудь может мне рассказать, как писать тесты на Selenium RC, и как их потом запускать.
не обижусь если мне предложат еще какуюнибудь литеретуру.

Автор: polosatij 25.10.2008, 17:42

идёшь на офсайт http://selenium.openqa.org/documentation/ и читаешь..  smile 

Автор: Molodec 6.1.2011, 10:02
Здравствуйте, у меня возникла идея. Есть ли какие либо библиотеки, для того, чтобы открыть браузер(можно даже в скрытом режиме) и дать ему команду, открыть страницу, нажать на ссылку и прочитать на следующей страницы содержимое текстового поля. Selenium все это позволяет делать, но к сожалению, в виде теста. А я хочу написать программу, которая сделает, допустим, следующие действия:
При нажатии на кнопку она откроет браузер, зайдет на сайт, пройдет по ссылку, прочтет текстовое поле с одним ID, запишет его в элемент формы. Далее прочтет текстовое поле с другим ID и также запишет его в элемент формы. То есть, чтобы это было обычное настольное приложение работающее с сетью и могло выполнять подобные действия. Что можете посоветовать?
Заранее благодарен.  

Автор: _Y_ 6.1.2011, 12:05
Molodec, я для таких дел всегда писал свой код. Открываю вебстраничку, делаю парсинг - нахожу данные, из которых надо построить зарос на следующую страничку.

Автор: Molodec 6.1.2011, 12:44
_Y_, вот вот, мне вот это как раз и интересно. С помощью каких средств Вы открываете, выполняете парсинг, посылаете запрос? Можете название либо ссылку дать, где об этих средствах можно почитать?

Автор: priam220 6.1.2011, 16:11
Добавлено @ 16:23
Цитата

Selenium все это позволяет делать, но к сожалению, в виде теста. 

Почему в виде теста? В виде теста вы можете это оформить, если захотите. Это полноценная библиотека, как мне кажется, позволяющая собрать все что вам нужно, причем самыми изощренными способами. Например, сервер будет подыматься на удаленной машине, а инфу получать вы будите на локальной.
Правда, это будет наверное ресурсоемко, для поставленной задачи и медленно.   В jdk есть средства (URLConnection, например), позволяющие послать запрос на хост, и получить ответ. Ответ можно пропарсить (regexp, например). Это будет куда быстрее и проще.


Автор: _Y_ 6.1.2011, 20:42
Molodec, вот код с какого-то сайта (забыл я уже откуда взял к своему стыду) -хорошо показывает как посылать запрос к серверу:

Код

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;
import java.net.URLConnection;

public class HTTPRequestPoster
{
    /**
     * Sends an HTTP GET request to a url
     *
     * @param endpoint - The URL of the server. (Example: " http://www.yahoo.com/search")
     * @param requestParameters - all the request parameters (Example: "param1=val1&param2=val2"). Note: This method will add the question mark (?) to the request - DO NOT add it yourself
     * @return - The response from the end point
     */
    public static String sendGetRequest(String endpoint, String requestParameters){
        
        BarcodingBaltic.logLink(endpoint);
        System.out.println(endpoint);

        
        String result = null;
        if (endpoint.startsWith("http://"))
        {
            // Send a GET request to the servlet
            try
            {
                // Construct data
                StringBuffer data = new StringBuffer();
        
                // Send data
                String urlStr = endpoint;
                if (requestParameters != null && requestParameters.length () > 0)
                {
                    urlStr += "?" + requestParameters;
                }
                
                System.out.println(urlStr);
                
                URL url = new URL(urlStr);
                URLConnection conn = url.openConnection ();

                // Get the response
                BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
                StringBuffer sb = new StringBuffer();
                String line;
                while ((line = rd.readLine()) != null)
                {
                    sb.append(line);
                }
                rd.close();
                result = sb.toString();
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * Reads data from the data reader and posts it to a server via POST request.
     * data - The data you want to send
     * endpoint - The server's address
     * output - writes the server's response to output
     * @throws Exception
     */
    public static void postData(Reader data, URL endpoint, Writer output) throws Exception
    {
        HttpURLConnection urlc = null;
        try
        {
            urlc = (HttpURLConnection) endpoint.openConnection();
            try
            {
                urlc.setRequestMethod("POST");
            } catch (ProtocolException e)
            {
                throw new Exception("Shouldn't happen: HttpURLConnection doesn't support POST??", e);
            }
            urlc.setDoOutput(true);
            urlc.setDoInput(true);
            urlc.setUseCaches(false);
            urlc.setAllowUserInteraction(false);
            urlc.setRequestProperty("Content-type", "text/xml; charset=" + "UTF-8");

            OutputStream out = urlc.getOutputStream();

            try
            {
                Writer writer = new OutputStreamWriter(out, "UTF-8");
                pipe(data, writer);
                writer.close();
            } catch (IOException e)
            {
                throw new Exception("IOException while posting data", e);
            } finally
            {
                if (out != null)
                    out.close();
            }

            InputStream in = urlc.getInputStream();
            try
            {
                Reader reader = new InputStreamReader(in);
                pipe(reader, output);
                reader.close();
            } catch (IOException e)
            {
                throw new Exception("IOException while reading response", e);
            } finally
            {
                if (in != null)
                    in.close();
            }

        } catch (IOException e)
        {
            throw new Exception("Connection error (is server running at " + endpoint + " ?): " + e);
        } finally
        {
            if (urlc != null)
                urlc.disconnect();
        }
    }

    /**
     * Pipes everything from the reader to the writer via a buffer
     */
    private static void pipe(Reader reader, Writer writer) throws IOException
    {
        char[] buf = new char[1024];
        int read = 0;
        while ((read = reader.read(buf)) >= 0)
        {
            writer.write(buf, 0, read);
        }
        writer.flush();
    }

}


Парсинг полученной HTML страницы можно делать, представляя страницу в виде какого-нибудь подходящего HTML объекта. Но, по моему опыту, это ненужные заморочки. Линк и два-три значения, которые нужно найти на странице, чтобы сформировать следующий запрос, проще найти в тексте HTML документа, предтавленном в виде String или StringBuffer. Самыми обычными методами indexOf  и/или split. Решение идеологически невыдержанное, зато быстрое и прекрасно работающее даже с битыми HTML страницами (если, конечно, на них имеется нужная информация smile ).


Автор: powerOn 7.1.2011, 14:41
Для работы с HTTP мне очень нравится клиентская библиотека http://jersey.java.net/. Например GET запрос:

Код

Client client = Client.create();
WebResource resource = client.resource(“http://localhost:8080/someresource”);
String pageText = resource.get(String.class);


Или с проверкой HTTP статус кода и query параметрами:

Код

Client client = Client.create();
WebResource resource = client.resource(“http://localhost:8080/someresource”);
ClientResponse response = resource.queryParam("someKey", "someValue").get(ClientResponse.class);
Assert.assertEquals(response.getStatus(), Response.Status.FORBIDDEN.getStatusCode());
String pageText = response.getEntity(String.class);


Там еще много всяких вкусностей, подробнее в доке http://jersey.java.net/nonav/documentation/latest/user-guide.html#client-api
 

Автор: Molodec 7.1.2011, 15:16
Спасибо, ребята! Для проверки данных как раз то, что надо!  smile 
А есть ли что-то для того, чтобы ввести логин и пароль на сайте? По крайней мере Selenium это может. Главное знать id элементов...

Автор: priam220 7.1.2011, 15:41
Цитата(Molodec @  7.1.2011,  15:16 Найти цитируемый пост)
По крайней мере Selenium это может

селениуму все равно что тыкать и что вводить. будь это пароль или что то другое. Специальных каких то функций для пароля, там нет. 
Установи httpfox плагин. Он поможет тебе сформировать правильно запрос.

Автор: Molodec 10.1.2011, 09:28
Цитата(priam220 @  7.1.2011,  15:41 Найти цитируемый пост)
Установи httpfox плагин. Он поможет тебе сформировать правильно запрос.

Спасибо. Я посмотрю. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)