From 98911b3c26283a3780cecb035e2e8e7d532834e0 Mon Sep 17 00:00:00 2001 From: alaoamo Date: Fri, 8 Apr 2016 11:06:55 +0200 Subject: [PATCH 1/5] completed both api with tests --- db.sqlite3 | Bin 43008 -> 58368 bytes noticia/blog/forms.py | 21 +- noticia/blog/models.py | 8 +- noticia/blog/serializers.py | 16 + .../templates/blog/event_confirm_delete.html | 2 +- noticia/blog/templates/blog/event_detail.html | 2 +- noticia/blog/templates/blog/event_form.html | 2 +- .../blog/newsitem_confirm_delete.html | 2 +- .../blog/templates/blog/newsitem_detail.html | 2 +- .../blog/templates/blog/newsitem_form.html | 2 +- .../blog/templates/blog/newsitem_list.html | 3 +- .../blog/templates/blog/newsitem_list.html~ | 10 +- noticia/blog/tests.py | 178 ++++- noticia/blog/urls.py | 24 +- noticia/blog/views.py | 57 +- noticia/blog/views.py~ | 115 ++++ noticia/settings.py | 9 +- noticia/settings.py~ | 123 ++++ noticia/urls.py | 2 +- noticia/urls.py~ | 23 + qa_selenium/.gitignore | 6 + qa_selenium/pom.xml | 212 ++++++ .../emergya/drivers/EmergyaChromeDriver.java | 212 ++++++ .../emergya/drivers/EmergyaFirefoxDriver.java | 217 ++++++ .../com/emergya/drivers/EmergyaIEDriver.java | 207 ++++++ .../com/emergya/drivers/EmergyaWebDriver.java | 187 ++++++ .../emergya/drivers/EmergyaWebDriverUtil.java | 620 ++++++++++++++++++ .../com/emergya/utils/Initialization.java | 324 +++++++++ .../com/emergya/utils/PropertiesHandler.java | 199 ++++++ .../com/emergya/utils/StringFormatter.java | 137 ++++ .../pageObjects/AdministrationMainPage.java | 308 +++++++++ .../emergya/pageObjects/BasePageObject.java | 284 ++++++++ .../emergya/pageObjects/EmergyaMainPage.java | 75 +++ .../emergya/pageObjects/GoogleMainPage.java | 88 +++ .../testSets/AdministrationTestSet.java | 411 ++++++++++++ .../com/emergya/testSets/GoogleTestSet.java | 273 ++++++++ .../com/emergya/utils/DefaultTestSet.java | 336 ++++++++++ .../test/java/com/emergya/utils/Factory.java | 9 + .../files/software/IEDriverServer.exe | Bin 0 -> 3553792 bytes .../resources/files/software/chromedriver | Bin 0 -> 5806960 bytes .../resources/files/software/chromedriver.exe | Bin 0 -> 5285376 bytes .../src/test/resources/log4j.properties | 10 + .../administrationmainpage.properties | 102 +++ .../selectors/emergyamainpage.properties | 4 + .../selectors/googlemainpage.properties | 15 + .../resources/suites/R1.0/R1.0-S1/US00001.xml | 14 + .../suites/emergyaAcceptanceTest.xml | 14 + .../resources/suites/emergyaFailedTest.xml | 9 + .../suites/emergyaRegressionTest.xml | 14 + .../src/test/resources/test.properties | 25 + 50 files changed, 4863 insertions(+), 50 deletions(-) create mode 100644 noticia/blog/serializers.py create mode 100644 noticia/blog/views.py~ create mode 100644 noticia/settings.py~ create mode 100644 noticia/urls.py~ create mode 100644 qa_selenium/.gitignore create mode 100644 qa_selenium/pom.xml create mode 100644 qa_selenium/src/main/java/com/emergya/drivers/EmergyaChromeDriver.java create mode 100644 qa_selenium/src/main/java/com/emergya/drivers/EmergyaFirefoxDriver.java create mode 100644 qa_selenium/src/main/java/com/emergya/drivers/EmergyaIEDriver.java create mode 100644 qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriver.java create mode 100644 qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriverUtil.java create mode 100644 qa_selenium/src/main/java/com/emergya/utils/Initialization.java create mode 100644 qa_selenium/src/main/java/com/emergya/utils/PropertiesHandler.java create mode 100644 qa_selenium/src/main/java/com/emergya/utils/StringFormatter.java create mode 100644 qa_selenium/src/test/java/com/emergya/pageObjects/AdministrationMainPage.java create mode 100644 qa_selenium/src/test/java/com/emergya/pageObjects/BasePageObject.java create mode 100644 qa_selenium/src/test/java/com/emergya/pageObjects/EmergyaMainPage.java create mode 100644 qa_selenium/src/test/java/com/emergya/pageObjects/GoogleMainPage.java create mode 100644 qa_selenium/src/test/java/com/emergya/testSets/AdministrationTestSet.java create mode 100644 qa_selenium/src/test/java/com/emergya/testSets/GoogleTestSet.java create mode 100644 qa_selenium/src/test/java/com/emergya/utils/DefaultTestSet.java create mode 100644 qa_selenium/src/test/java/com/emergya/utils/Factory.java create mode 100644 qa_selenium/src/test/resources/files/software/IEDriverServer.exe create mode 100644 qa_selenium/src/test/resources/files/software/chromedriver create mode 100644 qa_selenium/src/test/resources/files/software/chromedriver.exe create mode 100644 qa_selenium/src/test/resources/log4j.properties create mode 100644 qa_selenium/src/test/resources/selectors/administrationmainpage.properties create mode 100644 qa_selenium/src/test/resources/selectors/emergyamainpage.properties create mode 100644 qa_selenium/src/test/resources/selectors/googlemainpage.properties create mode 100644 qa_selenium/src/test/resources/suites/R1.0/R1.0-S1/US00001.xml create mode 100644 qa_selenium/src/test/resources/suites/emergyaAcceptanceTest.xml create mode 100644 qa_selenium/src/test/resources/suites/emergyaFailedTest.xml create mode 100644 qa_selenium/src/test/resources/suites/emergyaRegressionTest.xml create mode 100644 qa_selenium/src/test/resources/test.properties diff --git a/db.sqlite3 b/db.sqlite3 index 646aeefbd4b0cadb370d3c275539a1808ae6ae14..71694ee8fb68d10fa8afd402215d955c2560cc8a 100644 GIT binary patch literal 58368 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 dtd%^T*~f2Y{% csrf_token %} ¿Estás seguro que deseas borrar el "{{ object }}"? - Regresar + Regresar diff --git a/noticia/blog/templates/blog/event_detail.html b/noticia/blog/templates/blog/event_detail.html index 6e46b9e..8025e5f 100644 --- a/noticia/blog/templates/blog/event_detail.html +++ b/noticia/blog/templates/blog/event_detail.html @@ -13,7 +13,7 @@

{{ event.title }}

Editar Borrar - Regresar + Regresar

diff --git a/noticia/blog/templates/blog/event_form.html b/noticia/blog/templates/blog/event_form.html index 1b076b9..730e732 100644 --- a/noticia/blog/templates/blog/event_form.html +++ b/noticia/blog/templates/blog/event_form.html @@ -10,7 +10,7 @@ {% csrf_token %} {{ form.as_p }} - Regresar + Regresar diff --git a/noticia/blog/templates/blog/newsitem_confirm_delete.html b/noticia/blog/templates/blog/newsitem_confirm_delete.html index cc2fbcc..8e617f2 100644 --- a/noticia/blog/templates/blog/newsitem_confirm_delete.html +++ b/noticia/blog/templates/blog/newsitem_confirm_delete.html @@ -9,7 +9,7 @@
{% csrf_token %} ¿Estás seguro que deseas borrar la "{{ object }}"? - Regresar + Regresar
diff --git a/noticia/blog/templates/blog/newsitem_detail.html b/noticia/blog/templates/blog/newsitem_detail.html index c3f1287..44786c2 100644 --- a/noticia/blog/templates/blog/newsitem_detail.html +++ b/noticia/blog/templates/blog/newsitem_detail.html @@ -20,7 +20,7 @@

{{ newsitem.title }}

Editar v1 Borrar Borrar v1 - Regresar + Regresar

diff --git a/noticia/blog/templates/blog/newsitem_form.html b/noticia/blog/templates/blog/newsitem_form.html index 38f36da..63b5345 100644 --- a/noticia/blog/templates/blog/newsitem_form.html +++ b/noticia/blog/templates/blog/newsitem_form.html @@ -10,7 +10,7 @@ {% csrf_token %} {{ form.as_p }} - Regresar + Regresar diff --git a/noticia/blog/templates/blog/newsitem_list.html b/noticia/blog/templates/blog/newsitem_list.html index 95f144a..6d3a7a7 100644 --- a/noticia/blog/templates/blog/newsitem_list.html +++ b/noticia/blog/templates/blog/newsitem_list.html @@ -9,7 +9,8 @@ diff --git a/noticia/blog/templates/blog/newsitem_list.html~ b/noticia/blog/templates/blog/newsitem_list.html~ index 4663519..95f144a 100644 --- a/noticia/blog/templates/blog/newsitem_list.html~ +++ b/noticia/blog/templates/blog/newsitem_list.html~ @@ -9,15 +9,17 @@ -

hola

{% for post in NewsItem %}
-

{{ post.title }}

+

{{ post.title }}

{{ post.description}}

Publicación de la noticia: {{ post.publish_date }}

-
+ {% endfor %} + Regresar diff --git a/noticia/blog/tests.py b/noticia/blog/tests.py index 7ce503c..72ae1bc 100644 --- a/noticia/blog/tests.py +++ b/noticia/blog/tests.py @@ -1,3 +1,179 @@ from django.test import TestCase +from django.utils import timezone +from django.core.urlresolvers import reverse +from .models import NewsItem, Event +from .views import NewsItemForm, EventForm +from rest_framework.test import APITestCase, APIClient +from django.contrib.auth.models import User +from rest_framework import status -# Create your tests here. + +def news_example(title): + ahora = timezone.now() + return NewsItem.objects.create(title=title, description="prueba descripcion", publish_date=ahora) + + +def event_example(title): + ahora = timezone.now() + return Event.objects.create(title=title, description="prueba descripcion", start_date=ahora, end_date=ahora) + + +class NewsItemEventTest(TestCase): + + def test_index(self): + resp = self.client.get(reverse('blog:index')) + self.assertEqual(resp.status_code, 200) + + def test_noticia(self): + resp = self.client.get(reverse('blog:noticias')) + self.assertEqual(resp.status_code, 200) + + def test_evento(self): + resp = self.client.get(reverse('blog:eventos')) + self.assertEqual(resp.status_code, 200) + + def test_both(self): + resp = self.client.get(reverse('blog:todo')) + self.assertEqual(resp.status_code, 200) + + def test_class_form(self): + data = {'title': "titulo", 'description': "descripcion", 'publish_date': timezone.now()} + form = NewsItemForm(data=data) + form.save() + self.assertTrue(form.is_valid()) + x = NewsItem.objects.get(title="titulo") + self.assertTrue(x) + + def test_v2detail(self): + w = news_example("prueba") + resp = self.client.get(reverse('blog:detailnews', kwargs={'pk': w.id})) + self.assertEqual(resp.status_code, 200) + + def test_v1detail(self): + w = news_example("prueba") + resp = self.client.get(reverse('blog:1detailnews', kwargs={'pk': w.id})) + self.assertEqual(resp.status_code, 200) + + def test_news_create_v1(self): + resp = self.client.get(reverse('blog:1newnews')) + self.assertContains(resp, 'Publicar') + + def test_news_create_v2(self): + resp = self.client.get(reverse('blog:newnews')) + self.assertContains(resp, 'Publicar') + + def test_news_edit_v1(self): + w = news_example("prueba") + resp = self.client.get(reverse('blog:v1editnews', kwargs={'pk': w.id})) + self.assertEqual(resp.status_code, 200) + resp = self.client.get(reverse('blog:noticias')) + self.assertEqual(resp.status_code, 200) + + def test_news_edit_v2(self): + w = news_example("prueba") + resp = self.client.get(reverse('blog:editnews', kwargs={'pk': w.id})) + self.assertEqual(resp.status_code, 200) + + def test_news_delete_v1(self): + w = news_example("prueba") + resp = self.client.get(reverse('blog:v1deletenews', kwargs={'pk': w.id})) + self.assertEqual(resp.status_code, 200) + self.assertContains(resp, 'borrar') + + def test_news_delete_v2(self): + w = news_example("prueba") + resp = self.client.get(reverse('blog:deletenews', kwargs={'pk': w.id})) + self.assertEqual(resp.status_code, 200) + self.assertContains(resp, 'borrar') + + def test_eventdetail(self): + z = event_example("prueba") + resp = self.client.get(reverse('blog:detailevent', kwargs={'pk': z.id})) + self.assertEqual(resp.status_code, 200) + + def test_eventcreate(self): + resp = self.client.get(reverse('blog:newevent')) + self.assertContains(resp, 'Publicar') + + def test_eventedit(self): + z = event_example("prueba") + resp = self.client.get(reverse('blog:editevent', kwargs={'pk': z.id})) + self.assertEqual(resp.status_code, 200) + + def test_eventdelete(self): + z = event_example("prueba") + resp = self.client.get(reverse('blog:deleteevent', kwargs={'pk': z.id})) + self.assertEqual(resp.status_code, 200) + self.assertContains(resp, 'borrar') + +""" API TEST """ + + +class NewsItemListAPITestCase(APITestCase): + + def addUser(self): + User.objects.create_user(username='admin', password='proyecto', is_superuser=True) + return User.objects.get(username='admin') + + def addNewsItem(self): + form = NewsItemForm(data={'owner': self.addUser().id, 'title': "titulo", 'description': "descripcion", 'publish_date': timezone.now()}) + form.is_valid() + form.save() + return NewsItem.objects.get(title='titulo') + + def test_create(self): + user = self.addUser() + c = APIClient() + url = reverse('blog:apiNewsItem') + data = {'owner': user.id, 'title': "prueba", 'description': "prueba", 'publish_date': timezone.now()} + c.force_authenticate(user=user) + response = c.post(url, data, format='json') + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(NewsItem.objects.get().title, 'prueba') + + def test_read(self): + response = self.client.get(reverse('blog:apiNewsItem')) + self.assertEqual(response.status_code, 200) + + def test_update_delete(self): + self.addNewsItem() + x = NewsItem.objects.get(title='titulo') + url = reverse('blog:apiDetailNewsItem', kwargs={'pk': x.id}) + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, 200) + self.assertEqual(NewsItem.objects.get().title, 'titulo') + + +class EventAPITestCase(APITestCase): + + def addUser(self): + User.objects.create_user(username='admin', password='proyecto', is_superuser=True) + return User.objects.get(username='admin') + + def addEvent(self): + form = EventForm(data={'owner': self.addUser().id, 'title': 'titulo', 'description': 'descripcion', 'start_date': timezone.now(), 'end_date': timezone.now()}) + form.is_valid() + form.save() + return Event.objects.get(title="titulo") + + def test_create(self): + user = self.addUser() + c = APIClient() + url = reverse('blog:apiEvent') + data = {'owner': user.id, 'title': 'prueba', 'description': 'prueba', 'start_date': timezone.now(), 'end_date': timezone.now()} + c.force_authenticate(user=user) + response = c.post(url, data, format='json') + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(Event.objects.get().title, 'prueba') + + def test_read(self): + response = self.client.get(reverse('blog:apiEvent')) + self.assertEqual(response.status_code, 200) + + def test_update_delete(self): + self.addEvent() + x = Event.objects.get(title='titulo') + url = reverse('blog:apiDetailEvent', kwargs={'pk': x.id}) + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, 200) + self.assertEqual(Event.objects.get().title, 'titulo') diff --git a/noticia/blog/urls.py b/noticia/blog/urls.py index 5093965..31238ff 100644 --- a/noticia/blog/urls.py +++ b/noticia/blog/urls.py @@ -1,36 +1,44 @@ from django.conf.urls import url from .views import ( - NewsItemList, + # NewsItemList, NewsItemDetail, NewsItemCreation, NewsItemUpdate, NewsItemDelete, - EventList, + #EventList, EventDetail, EventCreation, EventUpdate, - EventDelete + EventDelete, ) from . import views +from rest_framework.urlpatterns import format_suffix_patterns app_name = 'blog' urlpatterns = [ url(r'^$', views.index, name='index'), url(r'^todo/$', views.todo, name='todo'), url(r'^noticias/$', views.newsitem_list, name='noticias'), - url(r'^noticias/$', NewsItemList.as_view(), name='listnews'), - url(r'^noticias/(?P[0-9]+)/$', NewsItemDetail.as_view(), name='detailnews'), + # url(r'^noticias/$', NewsItemList.as_view(), name='listnews'), + url(r'^noticias/v2/(?P[0-9]+)/$', NewsItemDetail.as_view(), name='detailnews'), url(r'^noticias/v2/nuevo$', NewsItemCreation.as_view(), name='newnews'), url(r'^noticias/v2/(?P[0-9]+)/editar/$', NewsItemUpdate.as_view(), name='editnews'), url(r'^noticias/v2/borrar/(?P[0-9]+)/$', NewsItemDelete.as_view(), name='deletenews'), url(r'^eventos/$', views.event_list, name='eventos'), - url(r'^eventos/$', EventList.as_view(), name='listevent'), + #url(r'^eventos/$', EventList.as_view(), name='listevent'), url(r'^eventos/(?P[0-9]+)/$', EventDetail.as_view(), name='detailevent'), url(r'^eventos/nuevo$', EventCreation.as_view(), name='newevent'), url(r'^eventos/editar/(?P[0-9]+)/$', EventUpdate.as_view(), name='editevent'), url(r'^eventos/borrar/(?P[0-9]+)/$', EventDelete.as_view(), name='deleteevent'), #noticias v1 - url(r'^noticias/$', views.newsitem_list, name='noticias'), url(r'^noticias/v1/nuevo$', views.newsitem_create, name='1newnews'), + url(r'^noticias/v1/(?P[0-9]+)/$', NewsItemDetail.as_view(), name='1detailnews'), url(r'^noticias/v1/(?P[0-9]+)/editar$', views.newsitem_update, name='v1editnews'), - url(r'^noticias/v1/(?P[0-9]+)/borrar$', views.newsitem_delete, name='v1deletenews'), + url(r'^noticias/v1/borrar/(?P[0-9]+)/$', views.newsitem_delete, name='v1deletenews'), +#api newsitem + url(r'^apinews/$', views.NewsItemapi.as_view(), name="apiNewsItem"), + url(r'^apinews/(?P[0-9]+)/$', views.NewsItemDetailapi.as_view(), name="apiDetailNewsItem"), +#api event + url(r'^apievent/$', views.EventListapi.as_view(), name="apiEvent"), + url(r'^apievent/(?P[0-9]+)/$', views.EventDetailapi.as_view(), name="apiDetailEvent"), ] +urlpatterns = format_suffix_patterns(urlpatterns) diff --git a/noticia/blog/views.py b/noticia/blog/views.py index 8d3b613..082da18 100644 --- a/noticia/blog/views.py +++ b/noticia/blog/views.py @@ -11,13 +11,9 @@ from django.utils import timezone from .models import Event from django.shortcuts import redirect, get_object_or_404 -from django.forms import ModelForm - - -class NewsItemForm(ModelForm): - class Meta: - model = NewsItem - fields = ['title', 'description', 'publish_date'] +from .forms import NewsItemForm, EventForm +from .serializers import NewsItemSerializer, EventSerializer +from rest_framework import generics def newsitem_list1(request, template_name='blog/newsitem_list.html'): @@ -31,7 +27,7 @@ def newsitem_create(request, template_name='blog/newsitem_form.html'): form = NewsItemForm(request.POST or None) if form.is_valid(): form.save() - return redirect('blog:listnews') + return redirect('blog:noticias') return render(request, template_name, {'form': form}) @@ -40,7 +36,7 @@ def newsitem_update(request, pk, template_name='blog/newsitem_form.html'): form = NewsItemForm(request.POST or None, instance=post) if form.is_valid(): form.save() - return redirect('blog:listnews') + return redirect('blog:noticias') return render(request, template_name, {'form': form}) @@ -48,7 +44,7 @@ def newsitem_delete(request, pk, template_name='blog/newsitem_confirm_delete.htm post = get_object_or_404(NewsItem, pk=pk) if request.method == 'POST': post.delete() - return redirect('blog:listnews') + return redirect('blog:noticias') return render(request, template_name, {'object': post}) @@ -77,19 +73,20 @@ class NewsItemDetail(DetailView): class NewsItemCreation(CreateView): model = NewsItem - success_url = reverse_lazy('blog:listnews') - fields = ['title', 'description', 'publish_date'] + success_url = reverse_lazy('blog:noticias') + #ields = ['title', 'description', 'publish_date'] + form_class = NewsItemForm class NewsItemUpdate(UpdateView): model = NewsItem - success_url = reverse_lazy('blog:listnews') + success_url = reverse_lazy('blog:noticias') fields = ['title', 'description', 'publish_date'] class NewsItemDelete(DeleteView): model = NewsItem - success_url = reverse_lazy('blog:listnews') + success_url = reverse_lazy('blog:noticias') def event_list(request): @@ -107,16 +104,40 @@ class EventDetail(DetailView): class EventCreation(CreateView): model = Event - success_url = reverse_lazy('blog:listevent') - fields = ['title', 'description', 'start_date', 'end_date'] + success_url = reverse_lazy('blog:eventos') + """fields = ['title', 'description', 'start_date', 'end_date']""" + form_class = EventForm class EventUpdate(UpdateView): model = Event - success_url = reverse_lazy('blog:listevent') + success_url = reverse_lazy('blog:eventos') fields = ['title', 'description', 'start_date', 'end_date'] class EventDelete(DeleteView): model = Event - success_url = reverse_lazy('blog:listevent') + success_url = reverse_lazy('blog:eventos') + + +class NewsItemapi(generics.ListCreateAPIView): + + queryset = NewsItem.objects.all() + serializer_class = NewsItemSerializer + + +class NewsItemDetailapi(generics.RetrieveUpdateDestroyAPIView): + + queryset = NewsItem.objects.all() + serializer_class = NewsItemSerializer + + +class EventListapi(generics.ListCreateAPIView): + queryset = Event.objects.all() + serializer_class = EventSerializer + + +class EventDetailapi(generics.RetrieveUpdateDestroyAPIView): + + queryset = Event.objects.all() + serializer_class = EventSerializer diff --git a/noticia/blog/views.py~ b/noticia/blog/views.py~ new file mode 100644 index 0000000..8423b32 --- /dev/null +++ b/noticia/blog/views.py~ @@ -0,0 +1,115 @@ +from django.core.urlresolvers import reverse_lazy +from django.views.generic import ListView +from django.views.generic.detail import DetailView +from django.views.generic.edit import ( + CreateView, + UpdateView, + DeleteView + ) +from .models import NewsItem +from django.shortcuts import render +from django.utils import timezone +from .models import Event +from django.shortcuts import redirect, get_object_or_404 +from .forms import NewsItemForm + +def newsitem_list1(request, template_name='blog/newsitem_list.html'): + posts = NewsItem.objects.all() + data = {} + data['object_list'] = posts + return render(request, template_name, data) + + +def newsitem_create(request, template_name='blog/newsitem_form.html'): + form = NewsItemForm(request.POST or None) + if form.is_valid(): + form.save() + return redirect('blog:listnews') + return render(request, template_name, {'form': form}) + + +def newsitem_update(request, pk, template_name='blog/newsitem_form.html'): + post = get_object_or_404(NewsItem, pk=pk) + form = NewsItemForm(request.POST or None, instance=post) + if form.is_valid(): + form.save() + return redirect('blog:listnews') + return render(request, template_name, {'form': form}) + + +def newsitem_delete(request, pk, template_name='blog/newsitem_confirm_delete.html'): + post = get_object_or_404(NewsItem, pk=pk) + if request.method == 'POST': + post.delete() + return redirect('blog:listnews') + return render(request, template_name, {'object': post}) + + +def index(request): + return render(request, 'blog/index.html', {}) + + +def todo(request): + post = NewsItem.objects.filter(publish_date__lte=timezone.now()).order_by('publish_date') + event = Event.objects.filter(start_date__lte=timezone.now()).order_by('start_date') + return render(request, 'blog/both_list.html', {'NewsItem': post, 'Event': event}) + + +def newsitem_list(request): + post = NewsItem.objects.filter(publish_date__lte=timezone.now()).order_by('publish_date') + return render(request, 'blog/newsitem_list.html', {'NewsItem': post}) + + +class NewsItemList(ListView): + model = NewsItem + + +class NewsItemDetail(DetailView): + model = NewsItem + + +class NewsItemCreation(CreateView): + model = NewsItem + success_url = reverse_lazy('blog:listnews') + fields = ['title', 'description', 'publish_date'] + + +class NewsItemUpdate(UpdateView): + model = NewsItem + success_url = reverse_lazy('blog:listnews') + fields = ['title', 'description', 'publish_date'] + + +class NewsItemDelete(DeleteView): + model = NewsItem + success_url = reverse_lazy('blog:listnews') + + +def event_list(request): + event = Event.objects.all().order_by('start_date') + return render(request, 'blog/event_list.html', {'Event': event}) + + +class EventList(ListView): + model = Event + + +class EventDetail(DetailView): + model = Event + + +class EventCreation(CreateView): + model = Event + success_url = reverse_lazy('blog:listevent') + fields = ['title', 'description', 'start_date', 'end_date'] + + +class EventUpdate(UpdateView): + model = Event + success_url = reverse_lazy('blog:listevent') + fields = ['title', 'description', 'start_date', 'end_date'] + + +class EventDelete(DeleteView): + model = Event + success_url = reverse_lazy('blog:listevent') diff --git a/noticia/settings.py b/noticia/settings.py index 4d23f17..b8e3213 100644 --- a/noticia/settings.py +++ b/noticia/settings.py @@ -37,7 +37,9 @@ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - 'blog', + 'noticia.blog', + 'django_nose', + 'rest_framework', ] MIDDLEWARE_CLASSES = [ @@ -52,7 +54,10 @@ ] ROOT_URLCONF = 'noticia.urls' - +TEST_RUNNER = 'django_nose.NoseTestSuiteRunner' +NOSE_ARGS = [ + '--with-coverage', +] TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', diff --git a/noticia/settings.py~ b/noticia/settings.py~ new file mode 100644 index 0000000..4d23f17 --- /dev/null +++ b/noticia/settings.py~ @@ -0,0 +1,123 @@ +""" +Django settings for noticia project. + +Generated by 'django-admin startproject' using Django 1.9. + +For more information on this file, see +https://docs.djangoproject.com/en/1.9/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/1.9/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/1.9/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '*=80z8n+1mf_kf_fvm)%t5$!9io53(+@ulf0d(4nde0&ui$io!' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = [] + + +# Application definition + +INSTALLED_APPS = [ + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', + 'blog', +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'noticia.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'noticia.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/1.9/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + { + 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', + }, + { + 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', + }, +] + + +# Internationalization +# https://docs.djangoproject.com/en/1.9/topics/i18n/ + +LANGUAGE_CODE = 'es-es' + +TIME_ZONE = 'Europe/Madrid' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/1.9/howto/static-files/ + +STATIC_URL = '/static/' +STATIC_ROOT = os.path.join(BASE_DIR, 'static') diff --git a/noticia/urls.py b/noticia/urls.py index 17b8b8e..f8a8777 100644 --- a/noticia/urls.py +++ b/noticia/urls.py @@ -19,5 +19,5 @@ urlpatterns = [ url(r'^admin/', include(admin.site.urls)), - url(r'', include('blog.urls')), + url(r'', include('noticia.blog.urls')), ] diff --git a/noticia/urls.py~ b/noticia/urls.py~ new file mode 100644 index 0000000..17b8b8e --- /dev/null +++ b/noticia/urls.py~ @@ -0,0 +1,23 @@ +"""noticia URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/1.9/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') +Including another URLconf + 1. Add an import: from blog import urls as blog_urls + 2. Import the include() function: from django.conf.urls import url, include + 3. Add a URL to urlpatterns: url(r'^blog/', include(blog_urls)) +""" +from django.conf.urls import url, include +from django.contrib import admin + +urlpatterns = [ + url(r'^admin/', include(admin.site.urls)), + url(r'', include('blog.urls')), +] diff --git a/qa_selenium/.gitignore b/qa_selenium/.gitignore new file mode 100644 index 0000000..ef56cf2 --- /dev/null +++ b/qa_selenium/.gitignore @@ -0,0 +1,6 @@ +/target/ +.classpath +.project +/.settings/ +/test-output/ + diff --git a/qa_selenium/pom.xml b/qa_selenium/pom.xml new file mode 100644 index 0000000..2612ba2 --- /dev/null +++ b/qa_selenium/pom.xml @@ -0,0 +1,212 @@ + + 4.0.0 + com.emergya + qa_selenium + 0.0.1-SNAPSHOT + + + + UTF-8 + UTF-8 + 2.53.0 + 1.7 + 3.1 + 6.8.8 + 1.0.1 + 1.1 + 1.1.6 + 1.0-FCS + 1.0-FCS + 3.0 + 1.2.17 + + + Firefox + Ubuntu + false + target/surefire-reports/testCasesVideos + true + false + + + + localhost:8000/admin + + + + + + + QA-ENV + + ****URL**** + ****CONTEXT**** + + + + + STG-ENV + + ****URL**** + ****CONTEXT**** + + + + + + Mode-Dev + + false + false + + + + + Mode-Jenkins + + true + false + + + + + Mode-Debug + + true + true + + + + + + Emergya-Acceptance + + src/test/resources/suites/emergyaAcceptanceTest.xml + + + + + Emergya-Regression + + src/test/resources/suites/emergyaRegressionTest.xml + + + + + + + central + Maven Repository Switchboard + default + http://repo1.maven.org/maven2 + + false + + + + + + + org.testng + testng + ${testng.version} + + + + org.seleniumhq.selenium + selenium-java + ${selenium.version} + + + + com.pojosontheweb + monte-repack + ${monte.repack.version} + + + + org.jdom + jdom + ${jdom.version} + + + + jaxen + jaxen + ${jaxen.version} + + + + saxpath + saxpath + ${saxpath.version} + + + + org.jdom + jaxen-jdom + ${jaxen.jdom.version} + + + + org.apache.commons + commons-lang3 + ${commons.version} + + + + log4j + log4j + ${log4j.version} + + + com.sun.jmx + jmxri + + + com.sun.jdmk + jmxtools + + + javax.jms + jms + + + + + + + + + + + src/test/resources + true + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.16 + + + src/test/resources/suites/emergyaAcceptanceTest.xml + + + + + + org.apache.maven.plugins + maven-compiler-plugin + ${maven-compiler-plugin.version} + + ${java.version} + ${java.version} + + + + + diff --git a/qa_selenium/src/main/java/com/emergya/drivers/EmergyaChromeDriver.java b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaChromeDriver.java new file mode 100644 index 0000000..1dee3e3 --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaChromeDriver.java @@ -0,0 +1,212 @@ +package com.emergya.drivers; + +import org.openqa.selenium.By; +import org.openqa.selenium.chrome.ChromeDriver; +import org.openqa.selenium.chrome.ChromeOptions; + +/** + * Custom driver for chrome + * @author Jose Antonio Sanchez + * @author Alejandro Gomez + */ +public class EmergyaChromeDriver extends ChromeDriver + implements EmergyaWebDriver { + + /** + * Constructor + */ + public EmergyaChromeDriver() { + super(); + } + + public EmergyaChromeDriver(ChromeOptions chromeOptions) { + super(chromeOptions); + } + + // **** Basic operation methods section ****// + /** + * Checks if an element exists in the DOM + * @param selector By element + * @return True if the element exists in the DOM and false in the opposite case + */ + public boolean existsElement(By selector) { + return EmergyaWebDriverUtil.existsElement(this, selector); + } + + /** + * Checks if an element exists in the DOM and is displayed + * @param selector By element + * @return True if the element exists in the DOM and is displayed and false in the opposite case + */ + public boolean isElementDisplayed(By selector) { + return EmergyaWebDriverUtil.isElementDisplayed(this, selector); + } + + /** + * Clicks on an element after wait and if it is displayed + * @param selector By element + */ + public void clickIfExists(By selector) { + EmergyaWebDriverUtil.clickIfExists(this, selector); + } + + // **** Javascript methods section ****// + /** + * Executes JavaScript in the context of the currently window + * @param script The JavaScript to execute + * @return Boolean, Long, String, List, WebElement Or null + */ + public Object executeJavaScript(String script) { + return EmergyaWebDriverUtil.executeJavaScript(this, script); + } + + /** + * Puts the focus on an element through its id + * @param driver WebDriver element + * @param id string with the id of an element + */ + public void focus(String id) { + EmergyaWebDriverUtil.focus(this, id); + } + + // **** Screenshot methods section ****// + /** + * Saves a screenshot in a path with a timestamp + * @param folderPath to save the screenshot + * @param baseFileName file name + */ + public void saveScreenshotPath(String folderPath, String baseFileName) { + EmergyaWebDriverUtil.saveScreenshotPath(this, folderPath, baseFileName); + } + + /** + * Saves a screenshot in the default path + * @param driver WebDriver element + */ + public void saveScreenshotDefault() { + EmergyaWebDriverUtil.saveScreenshotDefault(this); + } + + // **** Sleep method ****// + /** + * Stops the execution during some seconds + * @param seconds time to stop the execution + */ + public void sleep(int seconds) { + EmergyaWebDriverUtil.sleep(seconds); + } + + // **** Keyboard events methods section ****// + /** + * Presses a keyboard key + * @param key to press + * @param sleepTime time to wait before and after to press the key + */ + public void pressKey(int key, int sleepTime) { + EmergyaWebDriverUtil.pressKey(key, sleepTime); + } + + /** + * Releases a keyboard key + * @param key to release + * @param sleepTime time to wait before and after to release the key + */ + public void releaseKey(int key, int sleepTime) { + EmergyaWebDriverUtil.releaseKey(key, sleepTime); + } + + /** + * Presses and releases a keyboard key + * @param key to press and release + */ + public void pressReleaseKey(int key) { + EmergyaWebDriverUtil.pressReleaseKey(key); + } + + // **** Mouse events methods section ****// + /** + * Moves the mouse over an element + * @param selector By element + */ + public void moveMouseOverElement(By selector) { + EmergyaWebDriverUtil.moveMouseOverElement(this, selector); + } + + /** + * Moves the mouse out of an element + * @param selector By element + */ + public void moveMouseOutElement(By selector) { + EmergyaWebDriverUtil.moveMouseOutElement(this, selector); + } + + /** + * Clicks with the mouse on an element + * @param selector By element + */ + public void clickOnWithMouse(By selector) { + EmergyaWebDriverUtil.clickOnWithMouse(this, selector); + } + + /** + * Clicks with the mouse out of an element + * @param selector By element + */ + public void clickOutWithMouse(By selector) { + EmergyaWebDriverUtil.clickOutWithMouse(this, selector); + } + + /** + * Double clicks with the mouse on an element + * @param selector By element + */ + public void doubleClickOnWithMouse(By selector) { + EmergyaWebDriverUtil.doubleClickOnWithMouse(this, selector); + + } + + // **** Wait methods section ****// + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element exist in the DOM and false in the opposite case + */ + public boolean wait(By selector, long seconds) { + return EmergyaWebDriverUtil.wait(this, selector, seconds); + } + + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is visible in the page and false in the opposite case + */ + public boolean waitUntilVisible(By selector, long seconds) { + return EmergyaWebDriverUtil.waitUntilVisible(this, selector, seconds); + } + + /** + * It sleeps the driver for X seconds. If the element is clickable in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is clickable in the page and false in the opposite case + */ + public boolean waitUntilElementClickable(By selector, long seconds) { + return EmergyaWebDriverUtil.waitUntilElementClickable(this, selector, + seconds); + } + + /** + * It sleeps the driver for X seconds. If the text is present in element, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @param text to be find + * @return true If the text is present in element, and false in the opposite case + */ + public boolean waitUntilTextPresent(By selector, long seconds, + String text) { + return EmergyaWebDriverUtil.waitUntilTextPresent(this, selector, + seconds, text); + } +} diff --git a/qa_selenium/src/main/java/com/emergya/drivers/EmergyaFirefoxDriver.java b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaFirefoxDriver.java new file mode 100644 index 0000000..012c739 --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaFirefoxDriver.java @@ -0,0 +1,217 @@ +package com.emergya.drivers; + +import org.openqa.selenium.By; +import org.openqa.selenium.firefox.FirefoxDriver; +import org.openqa.selenium.firefox.FirefoxProfile; +import org.openqa.selenium.remote.DesiredCapabilities; + +/** + * Custom driver for firefox + * @author Jose Antonio Sanchez + * @author Alejandro Gomez + */ +public class EmergyaFirefoxDriver extends FirefoxDriver + implements EmergyaWebDriver { + + /** + * Constructor + */ + public EmergyaFirefoxDriver() { + super(); + } + + public EmergyaFirefoxDriver(DesiredCapabilities capabilities) { + super(capabilities); + } + + public EmergyaFirefoxDriver(FirefoxProfile profile) { + super(profile); + } + + // **** Basic operation methods section ****// + /** + * Checks if an element exists in the DOM + * @param selector By element + * @return True if the element exists in the DOM and false in the opposite case + */ + public boolean existsElement(By selector) { + return EmergyaWebDriverUtil.existsElement(this, selector); + } + + /** + * Checks if an element exists in the DOM and is displayed + * @param selector By element + * @return True if the element exists in the DOM and is displayed and false in the opposite case + */ + public boolean isElementDisplayed(By selector) { + return EmergyaWebDriverUtil.isElementDisplayed(this, selector); + } + + /** + * Clicks on an element after wait and if it is displayed + * @param selector By element + */ + public void clickIfExists(By selector) { + EmergyaWebDriverUtil.clickIfExists(this, selector); + } + + // **** Javascript methods section ****// + /** + * Executes JavaScript in the context of the currently window + * @param script The JavaScript to execute + * @return Boolean, Long, String, List, WebElement Or null + */ + public Object executeJavaScript(String script) { + return EmergyaWebDriverUtil.executeJavaScript(this, script); + } + + /** + * Puts the focus on an element through its id + * @param driver WebDriver element + * @param id string with the id of an element + */ + public void focus(String id) { + EmergyaWebDriverUtil.focus(this, id); + } + + // **** Screenshot methods section ****// + /** + * Saves a screenshot in a path with a timestamp + * @param folderPath to save the screenshot + * @param baseFileName file name + */ + public void saveScreenshotPath(String folderPath, String baseFileName) { + EmergyaWebDriverUtil.saveScreenshotPath(this, folderPath, baseFileName); + } + + /** + * Saves a screenshot in the default path + * @param driver WebDriver element + */ + public void saveScreenshotDefault() { + EmergyaWebDriverUtil.saveScreenshotDefault(this); + } + + // **** Sleep method ****// + /** + * Stops the execution during some seconds + * @param seconds time to stop the execution + */ + public void sleep(int seconds) { + EmergyaWebDriverUtil.sleep(seconds); + } + + // **** Keyboard events methods section ****// + /** + * Presses a keyboard key + * @param key to press + * @param sleepTime time to wait before and after to press the key + */ + public void pressKey(int key, int sleepTime) { + EmergyaWebDriverUtil.pressKey(key, sleepTime); + } + + /** + * Releases a keyboard key + * @param key to release + * @param sleepTime time to wait before and after to release the key + */ + public void releaseKey(int key, int sleepTime) { + EmergyaWebDriverUtil.releaseKey(key, sleepTime); + } + + /** + * Presses and releases a keyboard key + * @param key to press and release + */ + public void pressReleaseKey(int key) { + EmergyaWebDriverUtil.pressReleaseKey(key); + } + + // **** Mouse events methods section ****// + /** + * Moves the mouse over an element + * @param selector By element + */ + public void moveMouseOverElement(By selector) { + EmergyaWebDriverUtil.moveMouseOverElement(this, selector); + } + + /** + * Moves the mouse out of an element + * @param selector By element + */ + public void moveMouseOutElement(By selector) { + EmergyaWebDriverUtil.moveMouseOutElement(this, selector); + } + + /** + * Clicks with the mouse on an element + * @param selector By element + */ + public void clickOnWithMouse(By selector) { + EmergyaWebDriverUtil.clickOnWithMouse(this, selector); + } + + /** + * Clicks with the mouse out of an element + * @param selector By element + */ + public void clickOutWithMouse(By selector) { + EmergyaWebDriverUtil.clickOutWithMouse(this, selector); + } + + /** + * Double clicks with the mouse on an element + * @param selector By element + */ + public void doubleClickOnWithMouse(By selector) { + EmergyaWebDriverUtil.doubleClickOnWithMouse(this, selector); + + } + + // **** Wait methods section ****// + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element exist in the DOM and false in the opposite case + */ + public boolean wait(By selector, long seconds) { + return EmergyaWebDriverUtil.wait(this, selector, seconds); + } + + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is visible in the page and false in the opposite case + */ + public boolean waitUntilVisible(By selector, long seconds) { + return EmergyaWebDriverUtil.waitUntilVisible(this, selector, seconds); + } + + /** + * It sleeps the driver for X seconds. If the element is clickable in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is clickable in the page and false in the opposite case + */ + public boolean waitUntilElementClickable(By selector, long seconds) { + return EmergyaWebDriverUtil.waitUntilElementClickable(this, selector, + seconds); + } + + /** + * It sleeps the driver for X seconds. If the text is present in element, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @param text to be find + * @return true If the text is present in element, and false in the opposite case + */ + public boolean waitUntilTextPresent(By selector, long seconds, + String text) { + return EmergyaWebDriverUtil.waitUntilTextPresent(this, selector, + seconds, text); + } +} diff --git a/qa_selenium/src/main/java/com/emergya/drivers/EmergyaIEDriver.java b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaIEDriver.java new file mode 100644 index 0000000..df47d3a --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaIEDriver.java @@ -0,0 +1,207 @@ +package com.emergya.drivers; + +import org.openqa.selenium.By; +import org.openqa.selenium.ie.InternetExplorerDriver; + +/** + * Custom driver for internet explorer + * @author Jose Antonio Sanchez + * @author Alejandro Gomez + */ +public class EmergyaIEDriver extends InternetExplorerDriver + implements EmergyaWebDriver { + + /** + * Constructor + */ + public EmergyaIEDriver() { + super(); + } + + // **** Basic operation methods section ****// + /** + * Checks if an element exists in the DOM + * @param selector By element + * @return True if the element exists in the DOM and false in the opposite case + */ + public boolean existsElement(By selector) { + return EmergyaWebDriverUtil.existsElement(this, selector); + } + + /** + * Checks if an element exists in the DOM and is displayed + * @param selector By element + * @return True if the element exists in the DOM and is displayed and false in the opposite case + */ + public boolean isElementDisplayed(By selector) { + return EmergyaWebDriverUtil.isElementDisplayed(this, selector); + } + + /** + * Clicks on an element after wait and if it is displayed + * @param selector By element + */ + public void clickIfExists(By selector) { + EmergyaWebDriverUtil.clickIfExists(this, selector); + } + + // **** Javascript methods section ****// + /** + * Executes JavaScript in the context of the currently window + * @param script The JavaScript to execute + * @return Boolean, Long, String, List, WebElement Or null + */ + public Object executeJavaScript(String script) { + return EmergyaWebDriverUtil.executeJavaScript(this, script); + } + + /** + * Puts the focus on an element through its id + * @param driver WebDriver element + * @param id string with the id of an element + */ + public void focus(String id) { + EmergyaWebDriverUtil.focus(this, id); + } + + // **** Screenshot methods section ****// + /** + * Saves a screenshot in a path with a timestamp + * @param folderPath to save the screenshot + * @param baseFileName file name + */ + public void saveScreenshotPath(String folderPath, String baseFileName) { + EmergyaWebDriverUtil.saveScreenshotPath(this, folderPath, baseFileName); + } + + /** + * Saves a screenshot in the default path + * @param driver WebDriver element + */ + public void saveScreenshotDefault() { + EmergyaWebDriverUtil.saveScreenshotDefault(this); + } + + // **** Sleep method ****// + /** + * Stops the execution during some seconds + * @param seconds time to stop the execution + */ + public void sleep(int seconds) { + EmergyaWebDriverUtil.sleep(seconds); + } + + // **** Keyboard events methods section ****// + /** + * Presses a keyboard key + * @param key to press + * @param sleepTime time to wait before and after to press the key + */ + public void pressKey(int key, int sleepTime) { + EmergyaWebDriverUtil.pressKey(key, sleepTime); + } + + /** + * Releases a keyboard key + * @param key to release + * @param sleepTime time to wait before and after to release the key + */ + public void releaseKey(int key, int sleepTime) { + EmergyaWebDriverUtil.releaseKey(key, sleepTime); + } + + /** + * Presses and releases a keyboard key + * @param key to press and release + */ + public void pressReleaseKey(int key) { + EmergyaWebDriverUtil.pressReleaseKey(key); + } + + // **** Mouse events methods section ****// + /** + * Moves the mouse over an element + * @param selector By element + */ + public void moveMouseOverElement(By selector) { + EmergyaWebDriverUtil.moveMouseOverElement(this, selector); + } + + /** + * Moves the mouse out of an element + * @param selector By element + */ + public void moveMouseOutElement(By selector) { + EmergyaWebDriverUtil.moveMouseOutElement(this, selector); + } + + /** + * Clicks with the mouse on an element + * @param selector By element + */ + public void clickOnWithMouse(By selector) { + EmergyaWebDriverUtil.clickOnWithMouse(this, selector); + } + + /** + * Clicks with the mouse out of an element + * @param selector By element + */ + public void clickOutWithMouse(By selector) { + EmergyaWebDriverUtil.clickOutWithMouse(this, selector); + } + + /** + * Double clicks with the mouse on an element + * @param selector By element + */ + public void doubleClickOnWithMouse(By selector) { + EmergyaWebDriverUtil.doubleClickOnWithMouse(this, selector); + + } + + // **** Wait methods section ****// + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element exist in the DOM and false in the opposite case + */ + public boolean wait(By selector, long seconds) { + return EmergyaWebDriverUtil.wait(this, selector, seconds); + } + + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is visible in the page and false in the opposite case + */ + public boolean waitUntilVisible(By selector, long seconds) { + return EmergyaWebDriverUtil.waitUntilVisible(this, selector, seconds); + } + + /** + * It sleeps the driver for X seconds. If the element is clickable in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is clickable in the page and false in the opposite case + */ + public boolean waitUntilElementClickable(By selector, long seconds) { + return EmergyaWebDriverUtil.waitUntilElementClickable(this, selector, + seconds); + } + + /** + * It sleeps the driver for X seconds. If the text is present in element, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @param text to be find + * @return true If the text is present in element, and false in the opposite case + */ + public boolean waitUntilTextPresent(By selector, long seconds, + String text) { + return EmergyaWebDriverUtil.waitUntilTextPresent(this, selector, + seconds, text); + } +} diff --git a/qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriver.java b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriver.java new file mode 100644 index 0000000..6a170bf --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriver.java @@ -0,0 +1,187 @@ +package com.emergya.drivers; + +import java.util.List; + +import org.openqa.selenium.By; +import org.openqa.selenium.WebDriver; +import org.openqa.selenium.WebElement; + +/** + * Emergya custom interface that extends WebDriver + * @author Jose Antonio Sanchez + * @author Alejandro Gomez + */ +public interface EmergyaWebDriver extends WebDriver { + + // **** Basic operation methods section ****// + /** + * Checks if an element exists in the DOM + * @param selector By element + * @return True if the element exists in the DOM and false in the opposite case + */ + public boolean existsElement(By selector); + + /** + * Checks if an element exists in the DOM and is displayed + * @param selector By element + * @return True if the element exists in the DOM and is displayed and false in the opposite case + */ + public boolean isElementDisplayed(By selector); + + /** + * Clicks on an element after wait and if it is displayed + * @param selector By element + */ + public void clickIfExists(By selector); + + // **** Javascript methods section ****// + /** + * Executes JavaScript in the context of the currently window + * @param script The JavaScript to execute + * @return Boolean, Long, String, List, WebElement Or null + */ + public Object executeJavaScript(String script); + + /** + * Puts the focus on an element through its id + * @param driver WebDriver element + * @param id string with the id of an element + */ + public void focus(String id); + + // **** Screenshot methods section ****// + /** + * Saves a screenshot in a path with a timestamp + * @param folderPath to save the screenshot + * @param baseFileName file name + */ + public void saveScreenshotPath(String folderPath, String baseFileName); + + /** + * Saves a screenshot in the default path + * @param driver WebDriver element + */ + public void saveScreenshotDefault(); + + // **** Sleep method ****// + /** + * Stops the execution during some seconds + * @param seconds time to stop the execution + */ + public void sleep(int seconds); + + // **** Keyboard events methods section ****// + /** + * Presses a keyboard key + * @param key to press + * @param sleepTime time to wait before and after to press the key + */ + public void pressKey(int key, int sleepTime); + + /** + * Releases a keyboard key + * @param key to release + * @param sleepTime time to wait before and after to release the key + */ + public void releaseKey(int key, int sleepTime); + + /** + * Presses and releases a keyboard key + * @param key to press and release + */ + public void pressReleaseKey(int key); + + // **** Mouse events methods section ****// + /** + * Moves the mouse over an element + * @param selector By element + */ + public void moveMouseOverElement(By selector); + + /** + * Moves the mouse out of an element + * @param selector By element + */ + public void moveMouseOutElement(By selector); + + /** + * Clicks with the mouse on an element + * @param selector By element + * */ + public void clickOnWithMouse(By selector); + + /** + * Clicks with the mouse out of an element + * @param selector By element + */ + public void clickOutWithMouse(By selector); + + /** + * Double clicks with the mouse on an element + * @param selector By element + */ + public void doubleClickOnWithMouse(By selector); + + // **** Wait methods section ****// + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element exist in the DOM and false in the opposite case + */ + public boolean wait(By selector, long seconds); + + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is visible in the page and false in the opposite case + */ + public boolean waitUntilVisible(By selector, long seconds); + + /** + * It sleeps the driver for X seconds. If the element is clickable in the page, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is clickable in the page and false in the opposite case + */ + public boolean waitUntilElementClickable(By selector, long seconds); + + /** + * It sleeps the driver for X seconds. If the text is present in element, the execution continue without waiting X seconds + * @param selector By element for wait + * @param seconds to be slept + * @param text to be find + * @return true If the text is present in element, and false in the opposite case + */ + public boolean waitUntilTextPresent(By selector, long seconds, String text); + + // **** BasePageObject needed methods section ****// + /** + * Finds elements by xpath + * @param Xpath expression + * @return List of web elements + */ + public List findElementsByXPath(String xpath); + + /** + * Finds element by xpath + * @param Xpath expression + * @return WebElement web element + */ + public WebElement findElementByXPath(String xpath); + + /** + * Find an element by id + * @param id expression + * @return WebElement web element + */ + public WebElement findElementById(String id); + + /** + * Find an element by name + * @param name expression + * @return WebElement web element + */ + public WebElement findElementByName(String name); +} diff --git a/qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriverUtil.java b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriverUtil.java new file mode 100644 index 0000000..5cf57f1 --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/drivers/EmergyaWebDriverUtil.java @@ -0,0 +1,620 @@ +package com.emergya.drivers; + +import java.awt.AWTException; +import java.awt.MouseInfo; +import java.awt.Robot; +import java.awt.event.InputEvent; +import java.io.File; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.JavascriptExecutor; +import org.openqa.selenium.OutputType; +import org.openqa.selenium.Point; +import org.openqa.selenium.TakesScreenshot; +import org.openqa.selenium.TimeoutException; +import org.openqa.selenium.WebElement; +import org.openqa.selenium.support.ui.ExpectedConditions; +import org.openqa.selenium.support.ui.WebDriverWait; + +import com.emergya.utils.Initialization; + +/** + * Implements personalized methods to WebDriver + * @author Jose Antonio Sanchez + * @author Alejandro Gomez + */ +public class EmergyaWebDriverUtil { + + private static Logger log = Logger.getLogger(EmergyaWebDriverUtil.class); + + // **** Basic operation methods section ****// + /** + * Checks if an element exists in the DOM + * @param driver WebDriver element + * @param selector By element + * @return True if the element exists in the DOM and false in the opposite case + */ + public static boolean existsElement(EmergyaWebDriver driver, By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start existsElement method"); + + boolean exists = false; + + try { + exists = (driver.findElement(selector) != null); + } catch (Exception ex) { + exists = false; + } + + log.info("[log-Utils] EmergyaWebDriverUtil - End existsElement method"); + + return exists; + } + + /** + * Checks if an element exists in the DOM and is displayed + * @param driver WebDriver element + * @param selector By element + * @return True if the element exists in the DOM and is displayed and false in the opposite case + */ + public static boolean isElementDisplayed(EmergyaWebDriver driver, + By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start isElementDisplayed method"); + + boolean isDisplayed = false; + + try { + WebElement element = driver.findElement(selector); + isDisplayed = (element != null && element.isDisplayed()); + } catch (Exception ex) { + isDisplayed = false; + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End isElementDisplayed method"); + + return isDisplayed; + } + + /** + * Clicks on an element after wait and if it is displayed + * @param driver WebDriver element + * @param selector By element + */ + public static void clickIfExists(EmergyaWebDriver driver, By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start clickIfExists method"); + + wait(driver, selector, 20); + + if (isElementDisplayed(driver, selector)) { + driver.findElement(selector).click(); + } else { + log.error("The element " + selector.toString() + + " is not displayed."); + } + + log.info("[log-Utils] EmergyaWebDriverUtil - End clickIfExists method"); + } + + // **** Javascript methods section ****// + /** + * Executes JavaScript in the context of the currently window + * @param driver WebDriver element + * @param script The JavaScript to execute + * @return Boolean, Long, String, List, WebElement Or null + */ + public static Object executeJavaScript(EmergyaWebDriver driver, + String script) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start executeJavaScript method"); + log.info( + "[log-Utils] EmergyaWebDriverUtil - End executeJavaScript method"); + + return ((JavascriptExecutor) driver).executeScript(script); + } + + /** + * Puts the focus on an element through its id + * @param driver WebDriver element + * @param id string with the id of an element + */ + public static void focus(EmergyaWebDriver driver, String id) { + log.info("[log-Utils] EmergyaWebDriverUtil - Start focus method"); + + driver.executeJavaScript( + "document.getElementById('" + id + "').focus();"); + + log.info("[log-Utils] EmergyaWebDriverUtil - End focus method"); + } + + // **** Screenshot methods section ****// + /** + * Saves a screenshot in a path with a timestamp + * @param driver WebDriver element + * @param folderPath to save the screenshot + * @param baseFileName file name + */ + public static void saveScreenshotPath(EmergyaWebDriver driver, + String folderPath, String baseFileName) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start saveScreenshotPath method"); + + String timeStamp = getTimeStamp(); + File scrFile = ((TakesScreenshot) driver) + .getScreenshotAs(OutputType.FILE); + + try { + FileUtils.copyFile(scrFile, new File(folderPath + File.separator + + baseFileName + "_" + timeStamp + ".png")); + } catch (IOException e) { + log.error("Error creating screenshot", e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End saveScreenshotPath method"); + } + + /** + * Saves a screenshot in the default path + * @param driver WebDriver element + */ + public static void saveScreenshotDefault(EmergyaWebDriver driver) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start saveScreenshotDefault method"); + + String folderPath = Initialization.getInstance().getScreenshotPath(); + + saveScreenshotPath(driver, folderPath, ""); + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End saveScreenshotDefault method"); + } + + // **** Sleep method ****// + /** + * Stops the execution during some seconds + * @param seconds time to stop the execution + */ + public static void sleep(int seconds) { + log.info("[log-Utils] EmergyaWebDriverUtil - Start sleep method"); + + try { + Thread.sleep(seconds * 1000); + } catch (InterruptedException e) { + log.error("A thread has interrupted the current thread", e); + } + + log.info("[log-Utils] EmergyaWebDriverUtil - End sleep method"); + } + + // **** Keyboard events methods section ****// + /** + * Presses a keyboard key + * @param key to press + * @param sleepTime time to wait before and after to press the key + */ + public static void pressKey(int key, int sleepTime) { + log.info("[log-Utils] EmergyaWebDriverUtil - Start pressKey method"); + + Robot r; + + try { + r = new Robot(); + + Thread.sleep(sleepTime * 1000); + r.keyPress(key); + Thread.sleep(sleepTime * 1000); + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } catch (InterruptedException e) { + log.error("A thread has interrupted the current thread", e); + } + + log.info("[log-Utils] EmergyaWebDriverUtil - End pressKey method"); + } + + /** + * Releases a keyboard key + * @param key to release + * @param sleepTime time to wait before and after to release the key + */ + public static void releaseKey(int key, int sleepTime) { + log.info("[log-Utils] EmergyaWebDriverUtil - Start releaseKey method"); + + Robot r; + + try { + r = new Robot(); + + Thread.sleep(sleepTime * 1000); + r.keyRelease(key); + Thread.sleep(sleepTime * 1000); + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } catch (InterruptedException e) { + log.error("A thread has interrupted the current thread", e); + } + + log.info("[log-Utils] EmergyaWebDriverUtil - End releaseKey method"); + } + + /** + * Presses and releases a keyboard key + * @param key to press and to release + */ + public static void pressReleaseKey(int key) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start pressReleaseKey method"); + + Robot r; + + try { + r = new Robot(); + + r.keyPress(key); + Thread.sleep(500); + r.keyRelease(key); + Thread.sleep(500); + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } catch (InterruptedException e) { + log.error("A thread has interrupted the current thread", e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End pressReleaseKey method"); + } + + // **** Mouse events methods section ****// + /** + * Moves the mouse over an element + * @param driver WebDriver element + * @param selector By element + */ + public static void moveMouseOverElement(EmergyaWebDriver driver, + By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start moveMouseOverElement method"); + + Robot r; + + try { + r = new Robot(); + Point point = getPositionToClick(driver, selector); + java.awt.Point location = MouseInfo.getPointerInfo().getLocation(); + + if (((int) location.getX()) != point.getX() + || ((int) location.getY()) != point.getY()) { + r.mouseMove(point.getX(), point.getY()); + driver.sleep(2); + } + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End moveMouseOverElement method"); + } + + /** + * Moves the mouse out of an element + * @param driver WebDriver element + * @param selector By element + */ + public static void moveMouseOutElement(EmergyaWebDriver driver, + By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start moveMouseOutElement method"); + + Robot r; + int x = 0, y = 0; + + try { + r = new Robot(); + + if (existsElement(driver, selector)) { + WebElement element = driver.findElement(selector); + Point position = element.getLocation(); + + x = position.getX() - 10; + y = position.getY() - 10; + } + + Point toMove = new Point(x, y); + java.awt.Point location = MouseInfo.getPointerInfo().getLocation(); + + if (((int) location.getX()) != toMove.getX() + && ((int) location.getY()) != toMove.getY()) { + r.mouseMove(toMove.getX(), toMove.getY()); + driver.sleep(2); + } + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End moveMouseOutElement method"); + } + + /** + * Clicks with the mouse on an element + * @param driver WebDriver element + * @param selector By element + */ + public static void clickOnWithMouse(EmergyaWebDriver driver, By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start clickOnWithMouse method"); + + Robot r; + + try { + r = new Robot(); + + moveMouseOverElement(driver, selector); + + r.mousePress(InputEvent.BUTTON1_MASK); + driver.sleep(1); + r.mouseRelease(InputEvent.BUTTON1_MASK); + driver.sleep(2); + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End clickOnWithMouse method"); + } + + /** + * Clicks with the mouse out of an element + * @param driver WebDriver element + * @param selector By element + */ + public static void clickOutWithMouse(EmergyaWebDriver driver, By selector) { + EmergyaWebDriverUtil.moveMouseOutElement(driver, selector); + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start clickOutWithMouse method"); + + try { + Robot r = new Robot(); + + moveMouseOutElement(driver, selector); + + r.mousePress(InputEvent.BUTTON1_MASK); + driver.sleep(1); + r.mouseRelease(InputEvent.BUTTON1_MASK); + driver.sleep(2); + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End clickOutWithMouse method"); + } + + /** + * Double clicks with the mouse on an element + * @param driver WebDriver element + * @param selector By element + */ + public static void doubleClickOnWithMouse(EmergyaWebDriver driver, + By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start doubleClickOnWithMouse method"); + + Robot r; + + try { + r = new Robot(); + + moveMouseOverElement(driver, selector); + + r.mousePress(InputEvent.BUTTON1_MASK); + r.mouseRelease(InputEvent.BUTTON1_MASK); + r.mousePress(InputEvent.BUTTON1_MASK); + r.mouseRelease(InputEvent.BUTTON1_MASK); + driver.sleep(2); + } catch (AWTException e) { + log.error( + "The platform configuration does not allow low-level input control", + e); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End doubleClickOnWithMouse method"); + } + + // **** Wait methods section ****// + /** + * It sleeps the driver for X seconds. If the element exist in the DOM, the execution continue without waiting X seconds + * @param driver WebDriver element for sleep + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element exist in the DOM and false in the opposite case + */ + public static boolean wait(EmergyaWebDriver driver, By selector, + long seconds) { + log.info("[log-Utils] EmergyaWebDriverUtil - Start wait method"); + + WebDriverWait w = new WebDriverWait(driver, seconds); + boolean retVal = true; + + try { + w.until(ExpectedConditions.presenceOfElementLocated(selector)); + } catch (TimeoutException e) { + retVal = false; + + log.error("The element: " + selector.toString() + + " is missing in the DOM. Waiting time: " + seconds + + " seconds"); + } + + log.info("[log-Utils] EmergyaWebDriverUtil - End wait method"); + + return retVal; + } + + /** + * It sleeps the driver for X seconds. If the element is visible in the page, the execution continue without waiting X seconds + * @param driver WebDriver element for sleep + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is visible in the page and false in the opposite case + */ + public static boolean waitUntilVisible(EmergyaWebDriver driver, By selector, + long seconds) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start waitUntilVisible method"); + + WebDriverWait w = new WebDriverWait(driver, seconds); + boolean retVal = true; + + try { + w.until(ExpectedConditions.visibilityOfElementLocated(selector)); + } catch (TimeoutException e) { + retVal = false; + + log.error("The element: " + selector.toString() + + " is not visible in the page. Waiting time: " + seconds + + " seconds"); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End waitUntilVisible method"); + + return retVal; + } + + /** + * It sleeps the driver for X seconds. If the element is clickable in the page, the execution continue without waiting X seconds + * @param driver WebDriver element for sleep + * @param selector By element for wait + * @param seconds to be slept + * @return true if the element is clickable in the page and false in the opposite case + */ + public static boolean waitUntilElementClickable(EmergyaWebDriver driver, + By selector, long seconds) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start waitUntilElementClickable method"); + + WebDriverWait w = new WebDriverWait(driver, seconds); + boolean retVal = true; + + try { + w.until(ExpectedConditions.elementToBeClickable(selector)); + } catch (TimeoutException e) { + retVal = false; + + log.error("The element: " + selector.toString() + + " is not clickable. Waiting time: " + seconds + + " seconds"); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End waitUntilElementClickable method"); + + return retVal; + } + + /** + * It sleeps the driver for X seconds. If the text is present in element, the execution continue without waiting X seconds + * @param driver WebDriver element for sleep + * @param selector By element for wait + * @param seconds to be slept + * @param text to be find + * @return true If the text is present in element, and false in the opposite case + */ + public static boolean waitUntilTextPresent(EmergyaWebDriver driver, + By selector, long seconds, String text) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start waitUntilTextPresent method"); + + WebDriverWait w = new WebDriverWait(driver, seconds); + boolean retVal = true; + + try { + w.until(ExpectedConditions.textToBePresentInElementLocated(selector, + text)); + } catch (TimeoutException e) { + retVal = false; + + log.error("The text: " + text + " in the element: " + + selector.toString() + + " is missing in the DOM. Waiting time: " + seconds + + " seconds"); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End waitUntilTextPresent method"); + + return retVal; + } + + // **** Private methods section ****// + /** + * Generates a timestamp + * @return string with a timestamp + */ + private static String getTimeStamp() { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start getTimeStamp method"); + + String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HH-mm-ss") + .format(Calendar.getInstance().getTime()); + + log.info("[log-Utils] EmergyaWebDriverUtil - End getTimeStamp method"); + + return timeStamp; + + } + + /** + * Retrieves the center of an element to click it. + * @param driver WebDriver element + * @param selector By element + * @return Point the position of the center of the element + */ + private static Point getPositionToClick(EmergyaWebDriver driver, + By selector) { + log.info( + "[log-Utils] EmergyaWebDriverUtil - Start getPositionToClick method"); + + Point toReturn = null; + int x = 0, y = 0; + + if (existsElement(driver, selector)) { + WebElement element = driver.findElement(selector); + Point position = element.getLocation(); + + x = position.getX() + (element.getSize().getWidth() / 2); + y = position.getY() + (element.getSize().getHeight() / 2); + + toReturn = new Point(x, y); + } + + log.info( + "[log-Utils] EmergyaWebDriverUtil - End getPositionToClick method"); + + return toReturn; + } +} diff --git a/qa_selenium/src/main/java/com/emergya/utils/Initialization.java b/qa_selenium/src/main/java/com/emergya/utils/Initialization.java new file mode 100644 index 0000000..7630dbf --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/utils/Initialization.java @@ -0,0 +1,324 @@ +package com.emergya.utils; + +import java.io.File; +import java.io.IOException; +import java.util.Properties; +import java.util.regex.Matcher; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.Keys; +import org.openqa.selenium.chrome.ChromeOptions; +import org.openqa.selenium.firefox.FirefoxProfile; + +import com.emergya.drivers.EmergyaChromeDriver; +import com.emergya.drivers.EmergyaFirefoxDriver; +import com.emergya.drivers.EmergyaIEDriver; +import com.emergya.drivers.EmergyaWebDriver; + +/** + * Initializes properties and driver + * @author Jose Antonio Sanchez + */ +public class Initialization { + + private String properties; + private String browser; + private String context; + private String environment; + private String loginURL; + private String os; + private String screenshotPath; + private String videoRecordingPath; + private boolean recordVideo; + private boolean saveVideoForPassed; + private boolean ideEnabled; + private String downloadPath; + private int widthBeforeMaximize; + private int widthAfterMaximize; + private int heightBeforeMaximize; + private int heightAfterMaximize; + private static Initialization instance = null; + private Logger log = Logger.getLogger(Initialization.class); + + EmergyaWebDriver driver; + + /** + * Singleton pattern + * @return a single instance + */ + public static Initialization getInstance() { + if (instance == null) { + instance = new Initialization(); + } + return instance; + } + + /** + * Reads properties when the class is instanced + */ + private Initialization() { + this.readProperties(); + } + + // **** Read properties method ****// + public void readProperties() { + log.info("[log-Properties] " + this.getClass().getName() + + "- Start readProperties test"); + + properties = "test.properties"; + Properties prop = new Properties(); + log = Logger.getLogger(this.getClass()); + + try { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + + // Load a properties file + prop.load(loader.getResourceAsStream(properties)); + + // Get the property value + browser = prop.getProperty("browser"); + context = prop.getProperty("context"); + environment = prop.getProperty("environment"); + loginURL = environment + context; + os = prop.getProperty("OS"); + screenshotPath = prop.getProperty("screenshotPath"); + videoRecordingPath = prop.getProperty("videoRecordingPath", + this.screenshotPath); + recordVideo = "true".equals( + prop.getProperty("activateVideoRecording", "false")); + saveVideoForPassed = "true" + .equals(prop.getProperty("saveVideoForPassed", "false")); + ideEnabled = "true".equals(prop.getProperty("ideEnabled", "false")); + + // Generate download path + downloadPath = ""; + + String auxPath = this.getClass().getProtectionDomain() + .getCodeSource().getLocation().getFile(); + + String[] arrayPath = auxPath.split("/"); + + if (auxPath.startsWith(File.separator)) { + downloadPath = File.separator; + } + + for (int i = 1; i < arrayPath.length; i++) { + downloadPath = downloadPath + arrayPath[i] + "/"; + } + + downloadPath = downloadPath.replace("target/classes/", + prop.getProperty("downloadPath")); + + downloadPath = downloadPath.replaceAll("/", + Matcher.quoteReplacement(File.separator)); + + if (!downloadPath + .endsWith(Matcher.quoteReplacement(File.separator))) { + downloadPath += Matcher.quoteReplacement(File.separator); + } + + File file = new File(this.getDownloadPath()); + if (!file.exists()) { + file.mkdir(); + } + + log.info("Auto detected operative System = " + os); + } catch (IOException ex) { + log.error( + "test.properties file is not found. If this is the first time you excuted your test you can copy the settings properties file in the test folder in svn and customized it to match your environment"); + } + + log.info("[log-Properties] " + this.getClass().getName() + + "- End readProperties test"); + } + + // **** Driver initialization method ****// + public EmergyaWebDriver initialize() { + log.info("[log-Properties] " + this.getClass().getName() + + "- Start initialize test"); + + EmergyaWebDriver tmpDriver = null; + + // Driver initialization + if (browser.equalsIgnoreCase("Firefox")) { + FirefoxProfile firefoxProfile = new FirefoxProfile(); + + firefoxProfile.setPreference( + "browser.download.manager.focusWhenStarting", true); + firefoxProfile.setEnableNativeEvents(true); + firefoxProfile.setPreference("browser.download.folderList", 2); + firefoxProfile.setPreference( + "browser.download.manager.showWhenStarting", false); + firefoxProfile.setPreference("browser.download.dir", + this.getDownloadPath()); + + File dir = new File(this.getDownloadPath()); + if (dir.isDirectory()) { + File[] files = dir.listFiles(); + + for (File file : files) { + if (file.isFile()) { + file.delete(); + } + } + } + + firefoxProfile.setPreference( + "browser.helperApps.neverAsk.saveToDisk", + "application/x-jar,application/application/vnd.android.package-archive," + + "application/msword,application/x-rar-compressed,application/octet-stream," + + "application/csv, application/excel, application/vnd.ms-excel,application/x-excel, application/x-msexcel,text/csv," + + "image/jpeg, application/zip, video/x-msvideo, image/png, application/pdf, text/xml, text/html"); + firefoxProfile.setPreference("pdfjs.disabled", true); + + tmpDriver = new EmergyaFirefoxDriver(firefoxProfile); + + } else if (browser.equalsIgnoreCase("Chrome")) { + ChromeOptions options = new ChromeOptions(); + options.addArguments("--start-maximized"); + + if (os.equalsIgnoreCase("windows")) { + System.setProperty("webdriver.chrome.driver", + "files/software/chromedriver.exe"); + } else { + System.setProperty("webdriver.chrome.driver", + "files/software/chromedriver"); + } + + tmpDriver = new EmergyaChromeDriver(options); + } else if (browser.equalsIgnoreCase("IE") + && os.equalsIgnoreCase("windows")) { + System.setProperty("webdriver.ie.driver", + "files/software/IEDriverServer.exe"); + tmpDriver = new EmergyaIEDriver(); + } + + // Common functions + driver = tmpDriver; + + log.info("Browser initialized with dimensions: " + + driver.manage().window().getSize().getWidth() + "px X " + + driver.manage().window().getSize().getHeight() + "px"); + + widthBeforeMaximize = driver.manage().window().getSize().getWidth(); + heightBeforeMaximize = driver.manage().window().getSize().getHeight(); + + driver.get(loginURL); + + tmpDriver.findElement(By.tagName("body")).sendKeys(Keys.F11); + + driver.sleep(1); + + widthAfterMaximize = driver.manage().window().getSize().getWidth(); + heightAfterMaximize = driver.manage().window().getSize().getHeight(); + + if ((widthBeforeMaximize == widthAfterMaximize) + && (heightBeforeMaximize == heightAfterMaximize)) { + log.info("Not maximized first time...try again"); + + driver.sleep(1); + + tmpDriver.findElement(By.tagName("body")).sendKeys(Keys.F11); + + driver.sleep(2); + } + + this.cleanDownloadDirectory(); + + log.info("Browser resized with dimensions: " + + driver.manage().window().getSize().getWidth() + "px X " + + driver.manage().window().getSize().getHeight() + "px"); + + log.info("[log-Properties] " + this.getClass().getName() + + "- End initialize test"); + + return driver; + } + + // **** Getters methods section ****// + public String getBrowser() { + return browser; + } + + public String getContext() { + return context; + } + + public String getEnvironment() { + return environment; + } + + public String getLoginURL() { + return loginURL; + } + + public String getOS() { + return os; + } + + public String getScreenshotPath() { + return this.screenshotPath; + } + + public String getVideoRecordingPath() { + return videoRecordingPath; + } + + public boolean isRecordVideo() { + return recordVideo; + } + + public boolean isSaveVideoForPassed() { + return saveVideoForPassed; + } + + public boolean isIDEEnabled() { + return ideEnabled; + } + + public String getDownloadPath() { + return downloadPath; + } + + // **** Download methods section ****// + /** + * Returns the donwloaded filepath + * @param filename the name of the file + * @return the donwloaded filepath + */ + public String getDownloadedFilePath(String filename) { + String path = this.getDownloadPath() + filename; + File f = new File(path); + if (f.exists()) { + return path; + } else { + log.info("Not exists the file"); + return null; + } + } + + /** + * Cleans the download directory. + */ + public void cleanDownloadDirectory() { + File f = new File(this.getDownloadPath()); + if (f.exists() && f.isDirectory()) { + try { + FileUtils.cleanDirectory(f); + } catch (IOException e) { + log.error(e.getStackTrace()); + } + } + } + + /** + * Checks if the directory is empty. + * @return true is it's empty + */ + public boolean isEmptyDownloadDirectory() { + File f = new File(this.getDownloadPath()); + return f.exists() && f.isDirectory() && f.list().length == 0; + } +} diff --git a/qa_selenium/src/main/java/com/emergya/utils/PropertiesHandler.java b/qa_selenium/src/main/java/com/emergya/utils/PropertiesHandler.java new file mode 100644 index 0000000..dfbb4b6 --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/utils/PropertiesHandler.java @@ -0,0 +1,199 @@ +package com.emergya.utils; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + +import org.apache.log4j.Logger; + +/** + * Class to read the properties files + * @author Alejandro Gomez + * @contributor Ivan Bermudez + */ +public class PropertiesHandler { + + /** + * Logger class initialization. + */ + private static final Logger log = Logger.getLogger(PropertiesHandler.class); + + /** + * Properties cache. + */ + private Map properties; + + /** + * Instance of the PropertiesHandler class. + */ + private static PropertiesHandler instance = null; + + /** + * Attribute to have control about which is the last read file. + */ + private String lastReadFile; + + /** + * Default constructor. + */ + private PropertiesHandler() { + this.properties = new HashMap(); + this.lastReadFile = null; + } + + /** + * Returns an instance of the PropertiesHanler. + * @return PropertiesHandler instance. + */ + public static PropertiesHandler getInstance() { + // singleton pattern + if (instance == null) { + instance = new PropertiesHandler(); + } + return instance; + } + + /** + * Loads a properties file with the given filename. + * @param filename of the properties file to read or the path to the file. + * @return true/false if was read successfully. + */ + public boolean load(String filename) { + log.info("Reading properties from the file: " + filename); + boolean read = false; + // If it wasn't read previously + if (!this.properties.containsKey(filename)) { + log.info("There is no cached properties, reading them now from " + + filename); + this.lastReadFile = null; + InputStream inputStream = getInputStream(filename); + // if the file was loaded + if (inputStream != null) { + Properties propertiesFile = new Properties(); + try { + propertiesFile.load(inputStream); + // add the readed file into the cache + this.properties.put(filename, propertiesFile); + this.lastReadFile = filename; + read = true; + log.info(filename + " read and cached successfully!"); + } catch (IOException ex) { + log.error("An error occured reading properties from " + + filename + ": " + ex); + } + } else { + log.warn("Couldn't read properties from " + filename + + ". It seems the file doesn't exist"); + } + } else { + read = true; + this.lastReadFile = filename; + log.info( + "Properties were cached, so we don't have to read anything"); + } + return read; + } + + /** + * Returns an InputStream from a filename or file path. + * @param filename of the properties file to read or the path to the file. + * @return InputStream object. + */ + private InputStream getInputStream(String filename) { + log.info("Getting the inputStream for the filename " + filename); + // checking if it's a full path + File f = new File(propertyFileAbsolutePath(filename)); + InputStream inputStream = null; + if (f.exists() && !f.isDirectory()) { + log.info("It's a full path, and the file exists"); + try { + inputStream = new FileInputStream(f); + } catch (FileNotFoundException ex) { + log.error("The file was found BUT couldn't be loaded: " + ex); + } + } else { + log.info("Reading the file from the context"); + ClassLoader classLoader = Thread.currentThread() + .getContextClassLoader(); + inputStream = classLoader.getResourceAsStream(filename); + } + return inputStream; + } + + private String propertyFileAbsolutePath(String filename) { + String absoluteFileName = filename; + log.info("Checking configuration from absoluth path " + + absoluteFileName); + File f = new File(absoluteFileName); + if (f.exists() && !f.isDirectory()) { + return absoluteFileName; + } + + return filename; + } + + /** + * Retrieves the value of a given property. + * @param propertyName to read. + * @return value of the property or null if it doesn't exist. + */ + public String get(String propertyName) { + String value = null; + // return the key just if the file was loaded previously and if the + // Properties object exists + if (this.lastReadFile != null + && this.properties.containsKey(this.lastReadFile)) { + value = this.properties.get(this.lastReadFile) + .getProperty(propertyName); + } + return value; + } + + /** + * Refreshes all the loaded files reading them again. + * If a file doesn't exist now, it will not be refreshed. + */ + public void refreshLoadedFiles() { + log.info("Refreshing " + this.properties.size() + + " cached properties files"); + for (String filename : this.properties.keySet()) { + Properties oldProperties = this.properties.get(filename); + // removing the old Properties object to force reload it. + this.properties.remove(filename); + // if an error occurred, we put again the old properties + if (!this.load(filename)) { + log.error("An error occurred refreshing the " + filename + + " file. The old properties will be used again!"); + this.properties.put(filename, oldProperties); + } else { + log.info(filename + " refreshed successfully!"); + } + + } + } + + /** + * Refreshes a given property file. + * @param fileName to read. + * If a file doesn't exist now, it will not be refreshed. + */ + public void refreshPropertyFile(String fileName) { + log.info("Refreshing " + fileName + " cached property file"); + Properties oldProperties = this.properties.get(fileName); + // removing the old Properties object to force reload it. + this.properties.remove(fileName); + // if an error occurred, we put again the old properties + if (!this.load(fileName)) { + log.error("An error occurred refreshing the " + fileName + + " file. The old properties will be used again!"); + this.properties.put(fileName, oldProperties); + } else { + log.info(fileName + " refreshed successfully!"); + } + } +} diff --git a/qa_selenium/src/main/java/com/emergya/utils/StringFormatter.java b/qa_selenium/src/main/java/com/emergya/utils/StringFormatter.java new file mode 100644 index 0000000..51f6822 --- /dev/null +++ b/qa_selenium/src/main/java/com/emergya/utils/StringFormatter.java @@ -0,0 +1,137 @@ +package com.emergya.utils; + +import java.util.List; + +import org.apache.commons.lang3.StringUtils; + +/** + * Class to format text + * @author Alejandro Gomez + */ +public class StringFormatter { + + /** + * Escape strings with ' for xpath expression + * @param originalString + * @return escaped string + */ + public static String escapeSimpleQuotesForXpath(String originalString) { + return escapeQuotesForXpath(originalString, "'"); + } + + /** + * Escape strings with " for xpath expression + * @param originalString + * @return escaped string + */ + public static String escapeDoubleQuotesForXpath(String originalString) { + return escapeQuotesForXpath(originalString, "\""); + } + + /** + * Escape strings with " or ' for xpath expression + * @param originalString + * @return escaped string + */ + private static String escapeQuotesForXpath(String originalString, + String quote) { + String formattedString = ""; + if (StringUtils.isNotBlank(originalString) + && StringUtils.isNotBlank(quote)) { + String xpathDelimitter = "'"; + String xpathDelimiterForQuote; + if (quote.equals("\"")) { + xpathDelimiterForQuote = "'"; + } else { + xpathDelimiterForQuote = "\""; + } + + if (originalString.startsWith(quote)) { + formattedString += xpathDelimiterForQuote + quote + + xpathDelimiterForQuote; + formattedString += ","; + } + String[] parts = originalString.split(quote); + if (parts.length > 1) { + for (int i = 0; i < parts.length; i++) { + formattedString += xpathDelimitter + parts[i] + + xpathDelimitter; + if (i < parts.length - 1) { + formattedString += ","; + formattedString += xpathDelimiterForQuote + quote + + xpathDelimiterForQuote; + formattedString += ","; + } + } + if (originalString.endsWith(quote)) { + formattedString += ","; + formattedString += xpathDelimiterForQuote + quote + + xpathDelimiterForQuote; + } + formattedString = "concat(" + formattedString + ")"; + } else { + formattedString = xpathDelimitter + originalString + + xpathDelimitter; + } + } + return formattedString; + } + + /** + * Method to get a random string and different from other. + * @param stringToBeDifferent string we want to have another different. + * @return a different random string. + */ + public static String getARandomAndDifferentStringOf( + String stringToBeDifferent) { + StringBuffer buffer = new StringBuffer(); + String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + if (StringUtils.isNotBlank(stringToBeDifferent)) { + do { + for (int i = 0; i < stringToBeDifferent.length(); i++) { + double index = Math.random() * characters.length(); + buffer.append(characters.charAt((int) index)); + } + } while (buffer.toString().equalsIgnoreCase(stringToBeDifferent)); + } + return buffer.toString(); + } + + /** + * Method to get a random string and different from others. + * @param stringToBeDifferent string we want to have another different. + * @return a different random string. + */ + public static String getARandomAndDifferentStringOf( + List stringsToBeDifferent) { + + StringBuffer buffer = new StringBuffer(); + String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + if (!stringsToBeDifferent.isEmpty()) { + do { + for (int i = 0; i < stringsToBeDifferent.get(0).length(); i++) { + double index = Math.random() * characters.length(); + buffer.append(characters.charAt((int) index)); + } + } while (stringsToBeDifferent.contains(buffer.toString())); + } + return buffer.toString(); + } + + /** + * Method to get a random string with a lenght. + * @param length string length + * @return a random string. + */ + public static String getARandomWithALenght(int length) { + StringBuffer buffer = new StringBuffer(); + String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; + + for (int i = 0; i < length; i++) { + double index = Math.random() * characters.length(); + buffer.append(characters.charAt((int) index)); + } + + return buffer.toString(); + } +} diff --git a/qa_selenium/src/test/java/com/emergya/pageObjects/AdministrationMainPage.java b/qa_selenium/src/test/java/com/emergya/pageObjects/AdministrationMainPage.java new file mode 100644 index 0000000..b145eac --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/pageObjects/AdministrationMainPage.java @@ -0,0 +1,308 @@ +package com.emergya.pageObjects; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; + +import com.emergya.drivers.EmergyaWebDriver; + +public class AdministrationMainPage extends BasePageObject { + /** + * Logger class initialization. + */ + Logger log = Logger.getLogger(GoogleMainPage.class); + + /** + * Constructor method + * @param driver selenium webdriver + */ + public AdministrationMainPage(EmergyaWebDriver driver) { + super(driver); + this.isReady(); + } + + /** + * Checks that the PO is ready + * @param pageObject page object to be used + */ + @Override + public boolean isReady() { + log.info("[log-PageObjects] " + this.getClass().getSimpleName() + + " - Start isReady method"); + + boolean status = this.isElementVisibleByXPath("imgLogo"); + + log.info("[log-PageObjects] " + this.getClass().getSimpleName() + + " - End isReady method"); + + return status; + + } + + // Page object methods + /** + * This method do a search in google by a string search + * @param stringSearch + */ + public void doSearch() { + log.info("[log-" + this.getClass().getSimpleName() + + "]- Start doSearch -[" + this.getClass().getSimpleName() + + "- method]"); + + String userField = "admin"; + String passField = "proyecto"; + boolean a = false; + boolean b = false; + + if (this.isElementVisibleById("userField")) { + this.getElementById("userField").sendKeys(userField); + a = true; + } + ; + if (this.isElementVisibleById("passField")) { + this.getElementById("passField").sendKeys(passField); + b = true; + } + ; + if (a && b) { + if (this.isElementVisibleByXPath("sessionButton")) { + this.getElementByXPath("sessionButton").click(); + } + ; + } + ; + log.info( + "[log-" + this.getClass().getSimpleName() + "]- End doSearch -[" + + this.getClass().getSimpleName() + "- method]"); + }; + + /** + * This method insert a new news + * @param stringSearch + */ + public void addNew() { + log.info( + "[log-" + this.getClass().getSimpleName() + "]- Start addNew -[" + + this.getClass().getSimpleName() + "- method]"); + + String titleField = "hola"; + String descriptionField = "hola"; + boolean a = false; + boolean b = false; + boolean c = false; + boolean d = false; + + if (this.isElementVisibleById("titlenewsfield")) { + this.getElementById("titlenewsfield").sendKeys(titleField); + a = true; + } + ; + if (this.isElementVisibleById("descriptionnews")) { + this.getElementById("descriptionnews").sendKeys(descriptionField); + b = true; + } + ; + if (this.isElementVisibleByXPath("datenews")) { + this.getElementByXPath("datenews").click(); + c = true; + } + ; + + if (this.isElementVisibleByXPath("timenews")) { + this.getElementByXPath("timenews").click(); + d = true; + } + ; + + if (a && b && c && d) { + if (this.isElementVisibleByXPath("savenewsbutton")) { + this.getElementByXPath("savenewsbutton").click(); + } + ; + } + ; + log.info("[log-" + this.getClass().getSimpleName() + "]- End addNew -[" + + this.getClass().getSimpleName() + "- method]"); + }; + + /** + * This method do a search in google by a string search + * @param stringSearch + */ + public void deleteNew() { + log.info("[log-" + this.getClass().getSimpleName() + + "]- Start deleteNew -[" + this.getClass().getSimpleName() + + "- method]"); + + if (this.isElementVisibleByXPath("selectnews")) { + this.getElementByXPath("selectnews").click(); + } + if (this.isElementVisibleByXPath("selectdelete")) { + this.getElementByXPath("selectdelete").click(); + } + if (this.isElementVisibleByXPath("deletenews")) { + this.getElementByXPath("deletenews").click(); + } + ; + if (this.isElementVisibleByXPath("confirmdelete")) { + this.getElementByXPath("confirmdelete").click(); + } + ; + + log.info("[log-" + this.getClass().getSimpleName() + + "]- End deleteNew -[" + this.getClass().getSimpleName() + + "- method]"); + }; + + public void goAdmin() { + driver.get("localhost:8000/admin"); + }; + + /** + * This method insert a new news + * @param stringSearch + */ + public void addEvent() { + log.info("[log-" + this.getClass().getSimpleName() + + "]- Start addEvent -[" + this.getClass().getSimpleName() + + "- method]"); + + String titleField = "hola"; + String descriptionField = "hola"; + boolean a = false; + boolean b = false; + boolean c = false; + boolean d = false; + boolean e = false; + boolean f = false; + + if (this.isElementVisibleById("titleeventfield")) { + this.getElementById("titleeventfield").sendKeys(titleField); + a = true; + } + ; + if (this.isElementVisibleById("descriptionevent")) { + this.getElementById("descriptionevent").sendKeys(descriptionField); + b = true; + } + ; + if (this.isElementVisibleByXPath("dateeventstart")) { + this.getElementByXPath("dateeventstart").click(); + c = true; + } + ; + + if (this.isElementVisibleByXPath("timeeventstart")) { + this.getElementByXPath("timeeventstart").click(); + d = true; + } + ; + if (this.isElementVisibleByXPath("dateeventend")) { + this.getElementByXPath("dateeventend").click(); + e = true; + } + ; + if (this.isElementVisibleByXPath("timeeventend")) { + this.getElementByXPath("timeeventend").click(); + f = true; + } + ; + + if (a && b && c && d && e && f) { + if (this.isElementVisibleByXPath("saveeventbutton")) { + this.getElementByXPath("saveeventbutton").click(); + } + ; + } + ; + log.info( + "[log-" + this.getClass().getSimpleName() + "]- End addEvent -[" + + this.getClass().getSimpleName() + "- method]"); + }; + + /** + * This method do a search in google by a string search + * @param stringSearch + */ + public void deleteEvent() { + log.info("[log-" + this.getClass().getSimpleName() + + "]- Start deleteEvent -[" + this.getClass().getSimpleName() + + "- method]"); + + if (this.isElementVisibleByXPath("selectevent")) { + this.getElementByXPath("selectevent").click(); + } + if (this.isElementVisibleByXPath("selectdeleteevent")) { + this.getElementByXPath("selectdeleteevent").click(); + } + if (this.isElementVisibleByXPath("deleteevent")) { + this.getElementByXPath("deleteevent").click(); + } + ; + if (this.isElementVisibleByXPath("confirmdeleteevent")) { + this.getElementByXPath("confirmdeleteevent").click(); + } + ; + + log.info("[log-" + this.getClass().getSimpleName() + + "]- End deleteEvent -[" + this.getClass().getSimpleName() + + "- method]"); + }; + + /* + * This method do click to access to the admin main page. + */ + public AdministrationMainPage clickOnSessionAdministrationPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='login-form']/div[3]/input"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new AdministrationMainPage(driver); + }; + + public AdministrationMainPage clickOnNewsAdministrationPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='content-main']/div[2]/table/tbody/tr[2]/th/a"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new AdministrationMainPage(driver); + }; + + public AdministrationMainPage clickOnAddNewsAdministrationPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='content-main']/ul/li/a"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new AdministrationMainPage(driver); + }; + + public AdministrationMainPage clickOnEventAdministrationPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='content-main']/div[2]/table/tbody/tr[1]/th/a"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new AdministrationMainPage(driver); + }; + + public AdministrationMainPage clickOnAddEventAdministrationPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='content-main']/ul/li/a"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new AdministrationMainPage(driver); + }; +} diff --git a/qa_selenium/src/test/java/com/emergya/pageObjects/BasePageObject.java b/qa_selenium/src/test/java/com/emergya/pageObjects/BasePageObject.java new file mode 100644 index 0000000..539fad0 --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/pageObjects/BasePageObject.java @@ -0,0 +1,284 @@ +package com.emergya.pageObjects; + +import java.io.File; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; + +import com.emergya.drivers.EmergyaWebDriver; +import com.emergya.utils.Initialization; +import com.emergya.utils.PropertiesHandler; + +/** + * Class to group the common features of all PO's + * @author Jose Antonio Sanchez + * @author Alejandro Gomez + * @author Ivan Bermudez + */ +public abstract class BasePageObject { + + protected final EmergyaWebDriver driver; + protected Initialization config = Initialization.getInstance(); + protected String className = ""; + + static Logger log = Logger.getLogger(BasePageObject.class); + + public BasePageObject(EmergyaWebDriver driver) { + this.driver = driver; + this.className = getClass().getSimpleName(); + } + + /** + * TIMEOUT for elements. + */ + protected static final long TIMEOUT = 20; // Seconds + + /** + * This method builds the file selector path for each Page Object + * @return the file selectors path. + */ + protected String getSelectorsFilePath() { + String filePath = "selectors" + File.separatorChar; + String baseName = this.className.toLowerCase(); + filePath += baseName + ".properties"; + return filePath; + } + + /** + * Checks that the PO is ready + * @param pageObject page object to be used + */ + public abstract boolean isReady(); + + // **** ID methods section ****// + /** + * This method interacts with Selenium to retrieve the needed element. By ID + * @param key of the item to be selected. In the related selector file should exists an entry with: key.type and key.id + * @return the selected {@link Webelement} object + */ + public WebElement getElementById(String key) { + WebElement element = null; + PropertiesHandler handler = PropertiesHandler.getInstance(); + handler.load(this.getSelectorsFilePath()); + String type = handler.get(key + ".type"); // Could be null + String id = handler.get(key + ".id"); // getElementByIdJustId + + if (type == null && StringUtils.isNotBlank(id)) { + element = this.getElementByIdJustId(id); + } else { + if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(id)) { + element = this.getElementById(type, id); + } else { + log.error("Trying to retrieve from " + + this.getSelectorsFilePath() + + " file the item with the key " + key + " but " + key + + ".type and/or " + key + ".id are missing!"); + } + } + return element; + } + + /** + * This method checks if a {@link WebElement} is displayed and visible for selenium. By ID + * @param key of the item to be selected. In the related selector file should exists an entry with: key.type and key.id + * @return true if the element exists and it's visible. + */ + public boolean isElementVisibleById(String key) { + boolean showed = false; + WebElement element = this.getElementById(key); + if (isVisible(element)) { + showed = true; + } + return showed; + } + + // **** Name methods section ****// + /** + * This method interacts with Selenium to retrieve the needed element. By Name + * @param key of the item to be selected. In the related selector file should exists an entry with: key.type and key.name + * @return the selected {@link Webelement} object + */ + public WebElement getElementByName(String key) { + WebElement element = null; + PropertiesHandler handler = PropertiesHandler.getInstance(); + handler.load(this.getSelectorsFilePath()); + String type = handler.get(key + ".type"); // Could be null + String name = handler.get(key + ".name"); // getElementByNameJustName + + if (type == null && StringUtils.isNotBlank(name)) { + element = this.getElementByNameJustName(name); + } else { + if (StringUtils.isNotBlank(type) && StringUtils.isNotBlank(name)) { + element = this.getElementByName(type, name); + } else { + log.error("Trying to retrieve from " + + this.getSelectorsFilePath() + + " file the item with the key " + key + " but " + key + + ".type and/or " + key + ".name are missing!"); + } + } + return element; + } + + /** + * This method checks if a {@link WebElement} is displayed and visible for selenium. By Name + * @param key of the item to be selected. In the related selector file should exists an entry with: key.type and key.name + * @return true if the element exists and it's visible. + */ + public boolean isElementVisibleByName(String key) { + boolean showed = false; + WebElement element = this.getElementByName(key); + if (isVisible(element)) { + showed = true; + } + return showed; + } + + + // **** XPath methods section ****// + /** + * This method interacts with selenium to retrieve the needed element. By xpath + * @param key of the item to be selected. In the related selector file should exists an entry with: key.xpath + * @return the selected {@link WebElement} object. + */ + public WebElement getElementByXPath(String key) { + WebElement element = null; + PropertiesHandler handler = PropertiesHandler.getInstance(); + handler.load(this.getSelectorsFilePath()); + String xpath = handler.get(key + ".xpath"); + + if (StringUtils.isNotBlank(xpath)) { + element = this.getElementByXpath(xpath); + } else { + log.error("Trying to retrieve from " + this.getSelectorsFilePath() + + " file the item with the key " + key + " but " + key + + ".xpath is missing!"); + } + return element; + } + + /** + * This method interacts with selenium to retrieve the list of needed element. By xpath + * @param key of the items to be selected. In the related selector file should exists an entry with: key.xpath + * @return a List of the selected {@link WebElement} object + */ + public List getElementsByXPath(String key) { + List element = null; + PropertiesHandler handler = PropertiesHandler.getInstance(); + handler.load(this.getSelectorsFilePath()); + String xpath = handler.get(key + ".xpath"); + + if (StringUtils.isNotBlank(xpath)) { + element = this.getElementsByXpath(xpath); + } else { + log.error("Trying to retrieve from " + this.getSelectorsFilePath() + + " file the item(s) with the key " + key + " but " + key + + ".xpath is missing!"); + } + return element; + } + + /** + * This method checks if a {@link WebElement} is displayed and visible for selenium. By xpath + * @param xpath of the item to be selected. In the related selector file should exists an entry with and key.xpath + * @return true if the element exists and it's visible + */ + public boolean isElementVisibleByXPath(String key) { + boolean showed = false; + WebElement element = this.getElementByXPath(key); + if (element != null) { + showed = true; + } + return showed; + } + + // **** Private methods section ****// + /** + * This method interacts with selenium to retrieve the needed element by ID (just with ID) + * @param id of the element to be retrieved + * @return the built id selector. + */ + private WebElement getElementByIdJustId(String id) { + this.driver.wait(By.id(id), TIMEOUT); + return this.driver.findElementById(id); + } + + /** + * This method interacts with selenium to retrieve the needed element by ID + * @param type of the element to be retrieved + * @param id of the element to be retrieved + * @return the built id selector + */ + private WebElement getElementById(String type, String id) { + this.driver.wait(By.id(this.buildIdSelector(type, id)), TIMEOUT); + return this.driver.findElementById(this.buildIdSelector(type, id)); + } + + /** + * This method interacts with selenium to retrieve the needed element by Name (just with Name) + * @param id of the element to be retrieved + * @return the built name selector. + */ + private WebElement getElementByNameJustName(String name) { + this.driver.wait(By.name(name), TIMEOUT); + return this.driver.findElementByName(name); + } + + /** + * This method interacts with selenium to retrieve the needed element by Name + * @param type of the element to be retrieved + * @param name of the element to be retrieved + * @return the built name selector + */ + private WebElement getElementByName(String type, String name) { + this.driver.wait(By.name(this.buildIdSelector(type, name)), TIMEOUT); + return this.driver.findElementByName(this.buildIdSelector(type, name)); + } + + /** + * This method interacts with selenium to retrieve the needed element by xpath + * @param xpath of the element to be retrieved + * @return the built xpath selector. + */ + private WebElement getElementByXpath(String xpath) { + this.driver.wait(By.xpath(xpath), TIMEOUT); + return this.driver.findElementsByXPath(xpath).get(0); + } + + /** + * This method interacts with selenium to retrieve the needed elements by xpath + * @param xpath of the elements to be retrieved + * @return the built xpath list. + */ + private List getElementsByXpath(String xpath) { + this.driver.wait(By.xpath(xpath), TIMEOUT); + return this.driver.findElementsByXPath(xpath); + } + + /** + * It checks if an element is visible for selenium + * @param element to be checked + * @return if is showed the element + */ + private boolean isVisible(WebElement element) { + boolean showed = false; + if (element != null && element.isDisplayed()) { + showed = true; + } + return showed; + } + + /** + * This method builds the id selector using the UI logic + * @param type of the element to be retrieved + * @param id of the element to be retrieved + * @return the built id selector + */ + private String buildIdSelector(String type, String id) { + String buttonSelector = type + "-" + id; + return buttonSelector; + } +} diff --git a/qa_selenium/src/test/java/com/emergya/pageObjects/EmergyaMainPage.java b/qa_selenium/src/test/java/com/emergya/pageObjects/EmergyaMainPage.java new file mode 100644 index 0000000..c560e5c --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/pageObjects/EmergyaMainPage.java @@ -0,0 +1,75 @@ +package com.emergya.pageObjects; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; + +import com.emergya.drivers.EmergyaWebDriver; + +/** + * A Page Object (PO) contain the behavior of a specific page in the application + * EmergyaMainPage: This PO contain the methods to interact with the emergya main page + * @author Ivan Bermudez + * @author Jose Antonio Sanchez + */ +public class EmergyaMainPage extends BasePageObject { + + /** + * Logger class initialization. + */ + Logger log = Logger.getLogger(GoogleMainPage.class); + + /** + * Constructor method + * @param driver selenium webdriver + */ + public EmergyaMainPage(EmergyaWebDriver driver) { + super(driver); + this.isReady(); + } + + /** + * Checks that the PO is ready + * @param pageObject page object to be used + */ + @Override + public boolean isReady() { + log.info("[log-PageObjects] " + this.getClass().getSimpleName() + + " - Start isReady method"); + + boolean status = this.isElementVisibleByXPath("imgLogoEmergya"); + + log.info("[log-PageObjects] " + this.getClass().getSimpleName() + + " - End isReady method"); + + return status; + } + + // Page object methods + /* + * This method search contact tab on Emergya main page. + */ + public EmergyaMainPage clickOnContactEmergyaPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='block-menu-menu-cabecera']/ul/li[3]/a/span"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new EmergyaMainPage(driver); + } + + /* + * This method search Work with us in contact Emergya main page. + */ + public EmergyaMainPage clickOnWorkEmergyaPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xPathSelector = ".//*[@id='block-menu-menu-cabecera']/ul/li[1]/a/span"; + driver.clickIfExists(By.xpath(xPathSelector)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new EmergyaMainPage(driver); + } +} diff --git a/qa_selenium/src/test/java/com/emergya/pageObjects/GoogleMainPage.java b/qa_selenium/src/test/java/com/emergya/pageObjects/GoogleMainPage.java new file mode 100644 index 0000000..f28938a --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/pageObjects/GoogleMainPage.java @@ -0,0 +1,88 @@ +package com.emergya.pageObjects; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; + +import com.emergya.drivers.EmergyaWebDriver; + +/** + * A Page Object (PO) contain the behavior of a specific page in the application + * GoogleMainPage: This PO contain the methods to interact with the google main page + * @author Jose Antonio Sanchez + * @author Ivan Bermudez + */ +public class GoogleMainPage extends BasePageObject { + + /** + * Logger class initialization. + */ + Logger log = Logger.getLogger(GoogleMainPage.class); + + /** + * Constructor method + * @param driver selenium webdriver + */ + public GoogleMainPage(EmergyaWebDriver driver) { + super(driver); + this.isReady(); + } + + /** + * Checks that the PO is ready + * @param pageObject page object to be used + */ + @Override + public boolean isReady() { + log.info("[log-PageObjects] " + this.getClass().getSimpleName() + + " - Start isReady method"); + + boolean status = this.isElementVisibleById("imgLogo"); + + log.info("[log-PageObjects] " + this.getClass().getSimpleName() + + " - End isReady method"); + + return status; + } + + // Page object methods + /** + * This method do a search in google by a string search + * @param stringSearch + */ + public void doSearch(String stringSearch) { + log.info("[log-" + this.getClass().getSimpleName() + + "]- Start doSearch -[" + this.getClass().getSimpleName() + + "- method]"); + + String keyField = "searchField"; + String keySmallButtonSearch = "smallSearchButton"; + + if (this.isElementVisibleById(keyField)) { + this.getElementById(keyField).sendKeys(stringSearch); + + if (this.isElementVisibleById(keySmallButtonSearch)) { + this.getElementById(keySmallButtonSearch).click(); + } + } + + log.info( + "[log-" + this.getClass().getSimpleName() + "]- End doSearch -[" + + this.getClass().getSimpleName() + "- method]"); + } + + /** + * This method click on Emergya page + * @return + */ + public EmergyaMainPage clickOnEmergyaPage() { + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- Start clickOnPage method"); + String xpathLink = "//h3[@class='r']/a[contains(@href,'emergya.es')]"; + + driver.clickIfExists(By.xpath(xpathLink)); + + log.info("[log-pageObjects]" + this.getClass().getSimpleName() + + "]- End clickOnPage method"); + return new EmergyaMainPage(driver); + } +} \ No newline at end of file diff --git a/qa_selenium/src/test/java/com/emergya/testSets/AdministrationTestSet.java b/qa_selenium/src/test/java/com/emergya/testSets/AdministrationTestSet.java new file mode 100644 index 0000000..26a4bfc --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/testSets/AdministrationTestSet.java @@ -0,0 +1,411 @@ +package com.emergya.testSets; + +import static org.testng.AssertJUnit.assertTrue; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.emergya.pageObjects.AdministrationMainPage; +import com.emergya.utils.DefaultTestSet; + +/** + * A test class contain the tests of a specific page in the application + * @author Jose Antonio Sanchez + * @author Ivan Bermudez + */ +public class AdministrationTestSet extends DefaultTestSet { + + Logger log = Logger.getLogger(AdministrationTestSet.class); + + public AdministrationTestSet() { + super(); + } + + @BeforeMethod(description = "startTest") + public void before() { + super.before(); + } + + @AfterMethod(description = "endTest") + public void afterAllIsSaidAndDone() { + super.afterAllIsSaidAndDone(); + } + + // **************** TESTS **************** + // ------ EMERGYA QA SAMPLE TEST ------ // + // ------ US00001 - Check google main page and do a search ------ // + /** + * Description: Check the main page elements and do a search on google + * + * Pre steps: + * - Open the browser + * + * Steps: + * - Go to localhost:8000/admin + * - Check that the Administracion Django is displayed + * - Check that the 'user' field is displayed + * - Write user + * - Check that the 'pass' field is displayed + * - Write pass + * - Check that the 'iniciar sesion' button is displayed + * - Click button + * - Check that the 'evento' button is displayed + * - Check that the 'añadir evento' button is displayed + * - Check that the 'modificar noticia' button is displayed + * - Click on news items + * - Check 'añadir news item' button is displayed + * - Click on this button + * - Check text title field is displayed + * - Check publish date is displayed + * - Check 'save' button is displayed + * - Write title + * - write description + * - click date + * - click time + * - borrar la noticia creada + * - volver al admin + * hecho + * darle a eventos + * comprobar campos + * crear evento + * borrar evento creado + * volver al admin + * Post steps: + * - Close the browser + * @throws InterruptedException + * + */ + @Test(description = "administrationMainPageSearch") + public void administrationMainPage() throws InterruptedException { + log.info("[log-TestSet]es que " + this.getClass().getName() + + "- Start administrationMainPage test"); + + // Variable declaration and definition + administrationMainPage = new AdministrationMainPage(driver); + + // Steps to build the stage (Pre steps) + + try { + // Go to localhost:8000/admin + // Check that the administracion django logo is displayed + isLogoDisplayed(); + + // Check that the user field is displayed + isFieldUserDisplayed(); + + // Check that the pass field is displayed + isFieldPassDisplayed(); + + // Check that the 'iniciar sesion' button is displayed + isSessionButtonDisplayed(); + + // Check if we can go to the web + administrationMainPage.doSearch(); + + Thread.sleep(5000); + + // Check that the 'evento' button is displayed + isEventButtonDisplayed(); + // Check that the 'añadir evento' button is displayed + isAddEventButtonDisplayed(); + // Check that the 'añadir noticia' button is displayed + isModifyNewsButtonDisplayed(); + // Click on news items + administrationMainPage = administrationMainPage + .clickOnNewsAdministrationPage(); + // Check 'añadir news item' button is displayed + isAddNewsButtonDisplayed(); + // Click on this button + administrationMainPage = administrationMainPage + .clickOnAddNewsAdministrationPage(); + + // Thread.sleep(5000); + + // Check text title field is displayed + isTitleNewsFieldDisplayed(); + // Check publish date is displayed + isDescriptionNewsDisplayed(); + // Check 'save' button is displayed + isSaveNewsButtonDisplayed(); + + // Thread.sleep(5000); + // Publish a new + administrationMainPage.addNew(); + + // Thread.sleep(5000); + + // Delete a new + administrationMainPage.deleteNew(); + // Thread.sleep(5000); + // go admin page + administrationMainPage.goAdmin(); + + // Click on events + administrationMainPage = administrationMainPage + .clickOnEventAdministrationPage(); + // Check 'añadir evento' button is displayed + isAddEventsButtonDisplayed(); + // Click on this button + administrationMainPage = administrationMainPage + .clickOnAddEventAdministrationPage(); + + // Thread.sleep(5000); + + // Check text title field is displayed + isTitleEventFieldDisplayed(); + // Check publish date is displayed + isDescriptionEventDisplayed(); + // Check 'save' button is displayed + isSaveEventButtonDisplayed(); + + // Thread.sleep(5000); + // Publish a new + administrationMainPage.addEvent(); + + // Thread.sleep(5000); + + // Delete a new + administrationMainPage.deleteEvent(); + // Thread.sleep(5000); + // go admin page + administrationMainPage.goAdmin(); + Thread.sleep(5000); + + } finally { + // Steps to clear the stage (Post steps) + } + + log.info("[log-TestSet] " + this.getClass().getName() + + "- End administrationMainPageSearch test"); + } + + // ************************ Methods ************************* + /** + * Checks if the search return several results + * @return true if there are several results and false in the opposite case + */ + public boolean checkSeveralResults() { + String resultClassName = "r"; + List elements = null; + boolean isSeveral = false; + + driver.wait(By.className(resultClassName), 20); + + if (driver.isElementDisplayed(By.className(resultClassName))) { + elements = driver.findElements(By.className(resultClassName)); + + if (elements.size() > 1) { + isSeveral = true; + } + } + + return isSeveral; + } + + // ************************ Assertions ************************* + /** + * This assertion check if the search return several results + */ + public void areSeveralResults() { + assertTrue( + "There aren't several results, it should have several results", + this.checkSeveralResults()); + } + + /** + * This assertion check if logo is displayed + */ + public void isLogoDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + assertTrue("The logo isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleByXPath("imgLogo")); + } + + /** + * This assertion check if user field is displayed + */ + public void isFieldUserDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + assertTrue("The user field isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleByXPath("userField")); + } + + /** + * This assertion check if pass field is displayed + */ + public void isFieldPassDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + assertTrue("The pass field isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleByXPath("passField")); + } + + /** + * This assertion check if session button is displayed + */ + public void isSessionButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The 'iniciar sesion' button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("sessionButton")); + } + + /** + * This assertion check if event button is displayed + */ + public void isEventButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue("The event button isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleByXPath("eventButton")); + } + + /** + * This assertion check if add event button is displayed + */ + public void isAddEventButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add event button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("addeventButton")); + } + + /** + * This assertion check if modify news button is displayed + */ + public void isModifyNewsButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The modify news button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("modifynewsButton")); + }; + + /** + * this assertion check if add news item is displayed on the news item page + */ + public void isAddNewsButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("addnewsitemButton")); + }; + + public void isTitleNewsFieldDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleById("titlenewsfield")); + }; + + public void isDescriptionNewsDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleById("descriptionnews")); + }; + + public void isSaveNewsButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("savenewsbutton")); + }; + + /** + * this assertion check if add news item is displayed on the news item page + */ + public void isAddEventsButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("addeventsButton")); + }; + + public void isTitleEventFieldDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage.isElementVisibleById("titleeventfield")); + }; + + public void isDescriptionEventDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleById("descriptionevent")); + }; + + public void isSaveEventButtonDisplayed() { + if (administrationMainPage == null) { + administrationMainPage = new AdministrationMainPage(driver); + } + + /* Check by Name */ + assertTrue( + "The add news button isn't displayed, it should be displayed", + administrationMainPage + .isElementVisibleByXPath("saveeventbutton")); + }; + +} diff --git a/qa_selenium/src/test/java/com/emergya/testSets/GoogleTestSet.java b/qa_selenium/src/test/java/com/emergya/testSets/GoogleTestSet.java new file mode 100644 index 0000000..9080cb7 --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/testSets/GoogleTestSet.java @@ -0,0 +1,273 @@ +package com.emergya.testSets; + +import static org.testng.AssertJUnit.assertTrue; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.openqa.selenium.By; +import org.openqa.selenium.WebElement; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; +import org.testng.annotations.Test; + +import com.emergya.pageObjects.EmergyaMainPage; +import com.emergya.pageObjects.GoogleMainPage; +import com.emergya.utils.DefaultTestSet; + +/** + * A test class contain the tests of a specific page in the application + * @author Jose Antonio Sanchez + * @author Ivan Bermudez + */ +public class GoogleTestSet extends DefaultTestSet { + + Logger log = Logger.getLogger(GoogleTestSet.class); + + public GoogleTestSet() { + super(); + } + + @BeforeMethod(description = "startTest") + public void before() { + super.before(); + } + + @AfterMethod(description = "endTest") + public void afterAllIsSaidAndDone() { + super.afterAllIsSaidAndDone(); + } + + // **************** TESTS **************** + // ------ EMERGYA QA SAMPLE TEST ------ // + // ------ US00001 - Check google main page and do a search ------ // + /** + * Description: Check the main page elements and do a search on google + * + * Pre steps: + * - Open the browser + * + * Steps: + * - Go to www.google.es + * - Check that the google logo is displayed + * - Check that the 'Buscar con Google' button is displayed + * - Check that the 'Voy a tener suerte' button is displayed + * - Check that the search field is displayed + * - Do this search 'Hello world!' + * - Check that several results are displayed + * + * Post steps: + * - Close the browser + * + */ + @Test(description = "googleMainPageSearch") + public void googleMainPageSearch() { + log.info("[log-TestSet]es que " + this.getClass().getName() + + "- Start googleMainPageSearch test"); + + // Variable declaration and definition + googleMainPage = new GoogleMainPage(driver); + + // Steps to build the stage (Pre steps) + + try { + // Go to www.google.es + // Check that the google logo is displayed + isLogoDisplayed(); + + // Check that the 'Buscar con Google' button is displayed + isSearchButtonDisplayed(); + + // Check that the 'Voy a tener suerte' button is displayed + isLuckButtonDisplayed(); + + // Check that the search field is displayed + isFieldSearchDisplayed(); + + // Do this search 'Hello world!' + googleMainPage.doSearch("Hello world"); + + // Check that several results are displayed + areSeveralResults(); + + } finally { + // Steps to clear the stage (Post steps) + } + + log.info("[log-TestSet] " + this.getClass().getName() + + "- End googleMainPageSearch test"); + } + + /** + * Description: Do a search in Google and access to a page + * + * Pre steps: + * - Open the browser + * + * Steps: + * - Go to www.google.es + * - Do this search 'www.emergya.es' + * - Access to 'www.emergya.es' + * - Check that the logo is displayed + * - Access to the 'Contacto' page + * - Check that the address is displayed + * - Access to the 'Trabaja con nosotros' page + * - Check '¿QUÉ OFRECEMOS?' section is displayed + * + * Post steps: + * - Close the browser + * + */ + @Test(description = "googleDoSearchAndAccessToPage") + public void googleDoSearchAndAccessToPage() { + log.info("[log-TestSet] " + this.getClass().getName() + + "- Start googleDoSearchAndAccessToPage test"); + + // Variable declaration and definition + googleMainPage = new GoogleMainPage(driver); + + // Steps to build the stage (Pre steps) + + try { + // Go to www.google.es + // Do this search 'www.emergya.es' + googleMainPage.doSearch("www.emergya.es"); + + // Access to 'www.emergya.es' + emergyaMainPage = googleMainPage.clickOnEmergyaPage(); + + // Check that the logo is displayed + isEmergyaLogoDisplayed(); + + // TODO: Remove the following line when you complete the test + // assertTrue("Developing test", false); + + // Access to the 'Contact' page + emergyaMainPage = emergyaMainPage.clickOnContactEmergyaPage(); + // Check that the address is displayed + isAddressEmergyaDisplayed(); + // Access to the 'Trabaja con nosotros' page + emergyaMainPage = emergyaMainPage.clickOnWorkEmergyaPage(); + // Check '¿QUÉ OFRECEMOS?' section is displayed + isOfferDisplayed(); + } finally { + // Steps to clear the stage (Post steps) + } + + log.info("[log-TestSet] " + this.getClass().getName() + + "- End googleDoSearchAndAccessToPage test"); + } + + // ************************ Methods ************************* + /** + * Checks if the search return several results + * @return true if there are several results and false in the opposite case + */ + public boolean checkSeveralResults() { + String resultClassName = "r"; + List elements = null; + boolean isSeveral = false; + + driver.wait(By.className(resultClassName), 20); + + if (driver.isElementDisplayed(By.className(resultClassName))) { + elements = driver.findElements(By.className(resultClassName)); + + if (elements.size() > 1) { + isSeveral = true; + } + } + + return isSeveral; + } + + // ************************ Assertions ************************* + /** + * This assertion check if the search return several results + */ + public void areSeveralResults() { + assertTrue( + "There aren't several results, it should have several results", + this.checkSeveralResults()); + } + + /** + * This assertion check if logo is displayed + */ + public void isLogoDisplayed() { + if (googleMainPage == null) { + googleMainPage = new GoogleMainPage(driver); + } + assertTrue("The logo isn't displayed, it should be displayed", + googleMainPage.isElementVisibleById("imgLogo")); + } + + /** + * This assertion check if search button is displayed + */ + public void isSearchButtonDisplayed() { + if (googleMainPage == null) { + googleMainPage = new GoogleMainPage(driver); + } + + /* Check by Name */ + assertTrue("The search button isn't displayed, it should be displayed", + googleMainPage.isElementVisibleByName("searchButton")); + } + + /** + * This assertion check if luck button is displayed + */ + public void isLuckButtonDisplayed() { + if (googleMainPage == null) { + googleMainPage = new GoogleMainPage(driver); + } + assertTrue("The luck button isn't displayed, it should be displayed", + googleMainPage.isElementVisibleByXPath("luckButton")); + } + + /** + * This assertion check if search field is displayed + */ + public void isFieldSearchDisplayed() { + if (googleMainPage == null) { + googleMainPage = new GoogleMainPage(driver); + } + assertTrue("The search field isn't displayed, it should be displayed", + googleMainPage.isElementVisibleByXPath("searchField")); + } + + /** + * This assertion check if emergya logo is displayed + */ + public void isEmergyaLogoDisplayed() { + if (emergyaMainPage == null) { + emergyaMainPage = new EmergyaMainPage(driver); + } + assertTrue("The logo isn't displayed, it should be displayed", + emergyaMainPage.isElementVisibleByXPath("imgLogoEmergya")); + } + + /** + * This assertion check if the address of Emergya Sevilla is displayed + */ + public void isAddressEmergyaDisplayed() { + if (emergyaMainPage == null) { + emergyaMainPage = new EmergyaMainPage(driver); + } + assertTrue("The address isn't displayed, it should be displayed", + emergyaMainPage.isElementVisibleByXPath("imgAddressEmergya")); + } + + /** + * This assertion check if the field of offer is displayed + */ + public void isOfferDisplayed() { + if (emergyaMainPage == null) { + emergyaMainPage = new EmergyaMainPage(driver); + } + assertTrue("The offer isn't displayed, it should be displayed", + emergyaMainPage.isElementVisibleByXPath("imgOfferEmergya")); + } + +} diff --git a/qa_selenium/src/test/java/com/emergya/utils/DefaultTestSet.java b/qa_selenium/src/test/java/com/emergya/utils/DefaultTestSet.java new file mode 100644 index 0000000..c356536 --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/utils/DefaultTestSet.java @@ -0,0 +1,336 @@ +package com.emergya.utils; + +import static org.monte.media.FormatKeys.EncodingKey; +import static org.monte.media.FormatKeys.FrameRateKey; +import static org.monte.media.FormatKeys.KeyFrameIntervalKey; +import static org.monte.media.FormatKeys.MIME_AVI; +import static org.monte.media.FormatKeys.MediaTypeKey; +import static org.monte.media.FormatKeys.MimeTypeKey; +import static org.monte.media.VideoFormatKeys.CompressorNameKey; +import static org.monte.media.VideoFormatKeys.DepthKey; +import static org.monte.media.VideoFormatKeys.ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE; +import static org.monte.media.VideoFormatKeys.QualityKey; +import static org.testng.AssertJUnit.assertTrue; + +import java.awt.GraphicsConfiguration; +import java.awt.GraphicsEnvironment; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Method; +import java.text.SimpleDateFormat; +import java.util.Calendar; + +import org.apache.log4j.Logger; +import org.jdom.Document; +import org.jdom.Element; +import org.jdom.input.SAXBuilder; +import org.jdom.output.XMLOutputter; +import org.jdom.xpath.XPath; +import org.monte.media.Format; +import org.monte.media.FormatKeys.MediaType; +import org.monte.media.math.Rational; +import org.monte.screenrecorder.ScreenRecorder; +import org.monte.screenrecorder.ScreenRecorder.State; +import org.testng.ITestResult; +import org.testng.annotations.AfterMethod; +import org.testng.annotations.BeforeMethod; + +import com.emergya.drivers.EmergyaWebDriver; +import com.emergya.pageObjects.AdministrationMainPage; +import com.emergya.pageObjects.BasePageObject; +import com.emergya.pageObjects.EmergyaMainPage; +import com.emergya.pageObjects.GoogleMainPage; + +/** + * TestNG after and before methods + * @author Jose Antonio Sanchez + */ +public abstract class DefaultTestSet { + + protected static EmergyaWebDriver driver; + protected static Initialization config = Initialization.getInstance(); + protected AdministrationMainPage administrationMainPage; + protected GoogleMainPage googleMainPage; + protected EmergyaMainPage emergyaMainPage; + protected ScreenRecorder screenRecorder; + protected String tcName = ""; + private String failedSuitePath = "src/test/resources/suites/emergyaFailedTest.xml"; + + protected Logger log = Logger.getLogger(DefaultTestSet.class); + + @BeforeMethod + public void nameBefore(Method method) { + this.tcName = method.getName(); + } + + @BeforeMethod + public void before() { + driver = config.initialize(); + + if (driver != null && config.isRecordVideo() == true) { + long startTime = System.currentTimeMillis(); + try { + log.info("Recording video"); + + GraphicsConfiguration gc = GraphicsEnvironment + .getLocalGraphicsEnvironment().getDefaultScreenDevice() + .getDefaultConfiguration(); + + this.screenRecorder = new ScreenRecorder(gc, null, + new Format(MediaTypeKey, MediaType.FILE, MimeTypeKey, + MIME_AVI), + new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, + ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE, + CompressorNameKey, + ENCODING_AVI_TECHSMITH_SCREEN_CAPTURE, DepthKey, + 24, FrameRateKey, Rational.valueOf(15), + QualityKey, 1.0f, KeyFrameIntervalKey, 15 * 60), + new Format(MediaTypeKey, MediaType.VIDEO, EncodingKey, + "black", FrameRateKey, Rational.valueOf(30)), + null, new File(config.getVideoRecordingPath())); + + screenRecorder.start(); + } catch (Exception e) { + log.warn( + "Recorder could not be initilized. No video will be recording"); + } + log.info("Start recording in " + + (System.currentTimeMillis() - startTime) + " ms"); + } else { + log.info("No video recording"); + } + } + + @AfterMethod + public void afterAllIsSaidAndDone() { + log.info("Function afterAllIsSaidAndDone"); + + if (driver != null) { + if (driver != null) { + driver.manage().deleteAllCookies(); + driver.quit(); + } + } + } + + @AfterMethod + public void recordVideo(ITestResult result) { + if (driver != null && (config.isRecordVideo() == true) + && (screenRecorder != null) + && (screenRecorder.getState().equals(State.RECORDING))) { + + long startTime = System.currentTimeMillis(); + + try { + screenRecorder.stop(); + log.info("Recorder stoped"); + File tempRecordeFile = screenRecorder.getCreatedMovieFiles() + .get(0); + + if ((!config.isSaveVideoForPassed()) + && (result.getStatus() == 1)) { + log.info("Test passed. Deleting video"); + + if (tempRecordeFile.delete()) { + log.info("File deleted"); + } else { + log.warn("Video could not be deleted"); + } + } else { + String endPath = tempRecordeFile.getAbsolutePath() + .replaceAll("ScreenRecording", this.tcName); + if (tempRecordeFile.renameTo(new File(endPath))) { + log.info("File stored in " + endPath); + } else { + log.warn("Video could not be stored in " + endPath); + } + } + } catch (IOException e) { + log.warn("Recorder could not be stoped"); + } + + log.info("Recording video took " + + (System.currentTimeMillis() - startTime) + " ms"); + } + } + + @AfterMethod + public void checkFailedTest(ITestResult result) { + if (result.getMethod().getXmlTest().getName().equals("FailedTests")) { + removePassedTestToXML(result.getMethod().getRealClass().getName(), + result.getMethod().getMethodName()); + } else { + log.info("checkFailedTest.........result status of test is: " + + result.getStatus()); + + if (result.getStatus() == 2) { + log.info("name Of the xml TestSuite is " + + result.getMethod().getXmlTest().getName()); + + if (!result.getMethod().getXmlTest().getName() + .equals("Default test")) { + addFailedTestToXML( + result.getMethod().getRealClass().getName(), + result.getMethod().getMethodName()); + } + } else { + if (!result.getMethod().getXmlTest().getName() + .equals("Default test")) { + removePassedTestToXML( + result.getMethod().getRealClass().getName(), + result.getMethod().getMethodName()); + } + } + } + } + + // *** Public methods ***// + /** + * Obtains the initialization configuration + * @return initialization instance + */ + public static Initialization getConfig() { + return config; + } + + /** + * Method to get a timestamp + * @return string with the timestamp + */ + public static String getTimeStamp() { + String timeStamp = new SimpleDateFormat("dd-MM-yyyy_HH-mm-ss") + .format(Calendar.getInstance().getTime()); + return timeStamp; + } + + // *** Private methods ***// + /** + * Method to add failed test to a xml file + * @param suite name + * @param testName name of the test + */ + private void addFailedTestToXML(String suite, String testName) { + try { + SAXBuilder builder = new SAXBuilder(); + Document doc = builder.build(new FileInputStream(failedSuitePath)); + + Element foundElement = (Element) XPath.selectSingleNode(doc, + "/suite/test/classes/class[@name='" + suite + + "']/methods/include[@name='" + testName + "']"); + + if (foundElement == null) { + Element foundClass = (Element) XPath.selectSingleNode(doc, + "/suite/test/classes/class[@name='" + suite + "']"); + + if (foundClass != null) { + // Adding the method element + Element methodsElement = foundClass.getChild("methods"); + + // Adding the include element with the test name + Element includeElement = new Element("include"); + includeElement.setAttribute("name", testName); + methodsElement.addContent(includeElement); + + XMLOutputter xmlOutput = new XMLOutputter(); + xmlOutput.setFormat( + org.jdom.output.Format.getPrettyFormat()); + xmlOutput.output(doc, new FileWriter(failedSuitePath)); + } else { + Element rootElement = doc.getRootElement(); + + Element testElement = rootElement.getChild("test"); + + Element classesElement = testElement.getChild("classes"); + + // Adding the class element with the testSet name + Element classElement = new Element("class"); + classElement.setAttribute("name", suite); + classesElement.addContent(classElement); + + // Adding the method element + Element methodsElement = new Element("methods"); + classElement.addContent(methodsElement); + + // Adding the include element with the test name + Element includeElement = new Element("include"); + includeElement.setAttribute("name", testName); + methodsElement.addContent(includeElement); + + XMLOutputter xmlOutput = new XMLOutputter(); + xmlOutput.setFormat( + org.jdom.output.Format.getPrettyFormat()); + xmlOutput.output(doc, new FileWriter(failedSuitePath)); + } + } else { + log.info( + "The test is already added in the xml of failed tests"); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Method to remove passed test of the xml file + * @param suite name + * @param testName name of the test + */ + private void removePassedTestToXML(String suite, String testName) { + try { + SAXBuilder builder = new SAXBuilder(); + Document doc = builder.build(new FileInputStream(failedSuitePath)); + + Element rootElement = doc.getRootElement(); + Element testElement = rootElement.getChild("test"); + Element classesElement = testElement.getChild("classes"); + Element test = (Element) XPath.selectSingleNode(doc, + "/suite/test/classes/class[@name='" + suite + + "']/methods/include[@name='" + testName + "']"); + if (test != null) { + if (XPath.selectNodes(doc, "/suite/test/classes/class[@name='" + + suite + "']/methods/include").size() > 1) { + + Element testToRemove = (Element) XPath.selectSingleNode(doc, + "/suite/test/classes/class[@name='" + suite + + "']/methods/include[@name='" + testName + + "']"); + Element methodElement = (Element) XPath.selectSingleNode( + doc, "/suite/test/classes/class[@name='" + suite + + "']/methods"); + + methodElement.removeContent(testToRemove); + XMLOutputter xmlOutput = new XMLOutputter(); + xmlOutput.setFormat( + org.jdom.output.Format.getPrettyFormat()); + xmlOutput.output(doc, new FileWriter(failedSuitePath)); + } else { + classesElement.removeContent( + test.getParentElement().getParentElement()); + XMLOutputter xmlOutput = new XMLOutputter(); + xmlOutput.setFormat( + org.jdom.output.Format.getPrettyFormat()); + xmlOutput.output(doc, new FileWriter(failedSuitePath)); + } + + } else { + log.info("The test not exists in the xml of failed tests"); + } + + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * Checks that the PO is ready + * @param pageObject page object to be used + */ + protected void isReady(BasePageObject pageObject) { + assertTrue( + "The PO " + pageObject.getClass().getName() + " is not ready", + pageObject.isReady()); + } +} diff --git a/qa_selenium/src/test/java/com/emergya/utils/Factory.java b/qa_selenium/src/test/java/com/emergya/utils/Factory.java new file mode 100644 index 0000000..e305591 --- /dev/null +++ b/qa_selenium/src/test/java/com/emergya/utils/Factory.java @@ -0,0 +1,9 @@ +package com.emergya.utils; + +/** + * Generic class to do pre-steps and post-steps method + * @author Jose Antonio Sanchez + */ +public class Factory extends DefaultTestSet { + // Generic class to do pre-steps and post-steps method +} diff --git a/qa_selenium/src/test/resources/files/software/IEDriverServer.exe b/qa_selenium/src/test/resources/files/software/IEDriverServer.exe new file mode 100644 index 0000000000000000000000000000000000000000..6efc9c7620b76e8a4f9629a2f86955537bc7a254 GIT binary patch literal 3553792 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

PxONC3zdTZ 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 z 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≠c1n1A(~wSVT+&tpXY98gOAefJx81p3KhmD1wd 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 z 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

C3E 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

PiTHz5B)(uTYZkLw=o&PITOkaylx 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