learn-end-to-end-testing-with-puppeteer

Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.

In this tutorial, we’ll learn what testing is, the different types of testing, and then we’ll use Puppeteer to perform end-to-end testing on our application. By the end of this tutorial, you should be able to end-to-end test your apps easily with Puppeteer.

Prerequisites

For this tutorial, you need a basic knowledge of JavaScript, ES6 and Node.js.

You must also have installed the latest version of Node.js.

We’ll be using yarn throughout this tutorial. If you don’t have yarn already installed, install it from here.

You should also know the basics of Puppeteer. To understand the basics of Puppeteer, check out this simple tutorial.

To make sure we’re on the same page, these are the versions used in this tutorial:

  • Node 13.3.0
  • npm 6.13.2
  • yarn 1.21.1
  • puppeteer 2.0.0
  • create-react-app 3.3.0

Introduction to Testing

In simple terms, testing is a process to evaluate the application works as expected. It helps in catching bugs before your application gets deployed.

There are four different types of testing:

  1. Static Testing: uses a static type system like TypeScript, ReasonML, Flow or a linter like ESLint. This helps in capturing basic errors like typos and syntax.
  2. Unit Testing: the smallest part of an application, also known as a unit, is tested.
  3. Integration Testing: multiple related units are tested together to see if the application works perfectly in combination.
  4. End-to-end Testing: the entire application is tested from start to finish, just like a regular user would, to see if it behaves as expected.

The testing trophy by Kent C Dodds is a great visualization of the different types of testing:

Testing Trophy - Kent C Dodds

The testing trophy should be read bottom-to-top. If you perform these four levels of testing, you can be confident enough with the code you ship.

Now let’s perform end-to-end testing with Puppeteer.

End-to-end Testing with Puppeteer

Let’s bootstrap a new React project with create-react-app, also known as CRA. Go ahead and type the following in the terminal:

$ npx create-react-app e2e-puppeteer

This will bootstrap a new React project in a e2e-puppeteer folder. Thanks to the latest create-react-app version, this will also install testing-library by default so we can test our applications easily.

Go inside the e2e-puppeteer directory and start the server by typing the following in the terminal:

$ cd e2e-puppeteer
$ yarn start

It should look like this:

React Init

Our App.js looks like this:

import React from 'react';
import logo from './logo.svg';
import './App.css';

function App() {
  return (
    
logo

Edit src/App.js and save to reload.

Learn React
); } export default App;

We’ll be testing the App.js function and the code will be written in App.test.js. So go ahead and open up App.test.js. It should have the following content:

import React from 'react';
import { render } from '@testing-library/react'; // 1
import App from './App';

test('renders learn react link', () => { // 2
  const { getByText } = render(); // 3
  const linkElement = getByText(/learn react/i); // 4
  expect(linkElement).toBeInTheDocument(); // 5
});

Here’s what’s happening in the code above:

  1. We import the render function from the @testing-library/react package.
  2. We then use the global test function from Jest, which is our test runner installed by default through CRA. The first parameter is a string which describes our test, and the second parameter is a function where we write the code we want to test.
  3. Next up, we render the App component and destructure a method called getByText, which searches for all elements that have a text node with textContent.
  4. Then, we call the getByText function with the text we want to check. In this case, we check for learn react with the case insensitive flag.
  5. Finally, we make the assertion with the expect function to check if the text exists in the DOM.

This comes by default when we bootstrap with CRA. Go ahead and open up another terminal and type the following:

$ yarn test

When it shows a prompt, type a to run all the tests. You should now see this:

React Init Test

Now let’s test this application with end-to-end testing.

Testing the Boilerplate with Puppeteer

Go ahead and install puppeteer as a dev dependency by typing the following in the terminal:

$ yarn add -D puppeteer

Now open up App.test.js and paste the following:

import puppeteer from "puppeteer"; // 1

let browser;
let page;

// 2
beforeAll(async () => {
  browser = await puppeteer.launch({
    headless: false
  });
  page = await browser.newPage();
  await page.goto("http://localhost:3000/");
});

// 3
test("renders learn react link", async () => {
  await page.waitForSelector(".App");

  const header = await page.$eval(".App-header>p", e => e.innerHTML);
  expect(header).toBe(`Edit src/App.js and save to reload.`);

  const link = await page.$eval(".App-header>a", e => {
    return {
      innerHTML: e.innerHTML,
      href: e.href
    };
  });
  expect(link.innerHTML).toBe(`Learn React`);
  expect(link.href).toBe("https://reactjs.org/");
});

// 4
afterAll(() => {
  browser.close();
});

This is what we’re doing in the code above:

  1. Firstly, we import the puppeteer package and declare some global variables, browser and page.
  2. Then we have the beforeAll function provided by Jest. This runs before all tests are run. Here, we launch a new Chromium browser by calling puppeteer.launch(), while setting headless mode to false so we see what’s happening. Then, we create a new page by calling browser.newPage() and then go to our React application’s URL http://localhost:3000/ by calling the page.goto() function.
  3. Next up, we wait for the .App selector to load. When it loads, we get the innerHTML of .App-header>p selector by using the page.$eval() method and compare it with Edit src/App.js and save to reload.. We do the same thing with the .App-header>a selector. We get back innerHTML and href and then we compare them with Learn React and https://reactjs.org/ respectively to test our assertion with Jest’s expect() function.
  4. Finally, we call the afterAll function provided by Jest. This runs after all tests are run. Here, we close the browser.

This test should automatically run and give you the following result:

E2E Test Puppeteer Basic

Let’s go ahead and make a counter app.

Converting the Boilerplate to a Counter App

Firstly, edit some CSS by changing App.css to the following:

.header {
  font-size: 56px;
  text-align: center;
}

.counter-app {
  display: flex;
  justify-content: space-around;
}

button {
  background-color: navajowhite;
  font-size: 32px;
}

.count {
  font-size: 48px;
}

Now change App.js to the following:

import React, { useState } from "react";
import "./App.css";

function App() {
  const [count, setCount] = useState(0);
  return (
    <>
      

Counter

{count}
); } export default App;

Here, we’re making a simple counter application with two buttons, Increment and Decrement. By pressing the Increment button, the counter gets increased by 1, and by pressing Decrement button, the counter gets decreased by 1. It looks like this:

React Counter

Testing the Counter App with Puppeteer

Now change the App.test.js to the following:

import puppeteer from "puppeteer";

let browser;
let page;

beforeAll(async () => {
  browser = await puppeteer.launch({
    headless: false
  });
  page = await browser.newPage();
  await page.goto("http://localhost:3000/");
});

// 1
test("renders counter", async () => {
  await page.waitForSelector(".header");

  const header = await page.$eval(".header", e => e.innerHTML);
  expect(header).toBe("Counter");
});

// 2
test("sets initial state to zero", async () => {
  await page.waitForSelector(".counter-app");

  const count = await page.$eval(".count", e => e.innerHTML);
  expect(count).toBe("0");
});

// 3
test("increments counter by 1", async () => {
  await page.waitForSelector(".counter-app");

  await page.click(".increment");
  const count = await page.$eval(".count", e => e.innerHTML);
  expect(count).toBe("1");
});

// 4
test("decrements counter by 1", async () => {
  await page.waitForSelector(".counter-app");

  await page.click(".decrement");
  const count = await page.$eval(".count", e => e.innerHTML);
  expect(count).toBe("0");
});

afterAll(() => {
  browser.close();
});

Here, we keep the beforeAll and afterAll function the same, as before, where we initialize a browser and go to http://localhost:3000/ in beforeAll and we close the browser in afterAll. Then, we do the following:

  1. We check if the text Counter is rendered. For that, we wait for the .header selector to load. Then we use page.$eval() to get the innerHTML of .header selector. And then we finally make the assertion to check if Counter is rendered.
  2. Next, we check if the initial state is zero. We wait for the .counter-app selector to load. Then we get the innerHTML from the .count selector. We finally compare if the count is 0. Notice that we’re using a string while our state is a number. This is because innerHTML always returns a string.
  3. Here, we check if clicking the button increments the state by 1. First, we wait for the .counter-app selector to load. We then click on the .increment button. This should increase the state from 0 to 1. We then get the innerHTML from the .count selector. Then we compare it to 1, as our increment function should always increase state by 1.
  4. The decrement button should decrease the state by 1. It works the same way as the increment button. First, we wait for the .counter-app selector to load. We then click on the .decrement button. This should decrease the state from 1 to 0. Notice that the state was 1 after we clicked the increment button. We then get the innerHTML from the .count selector. Then we compare it to 0, as our decrement function should always decrease state by 1.

The result should now look like this:

E2E Test Puppeteer Counter

Conclusion

In this tutorial, we learned about different types of testing — static testing, unit testing, integration testing and end-to-end testing. We then performed end-to-end testing on our boilerplate, bootstrapped with the help of create-react-app.

Later, we converted the app to a counter application. And finally we performed end-to-end testing on the counter application.

The Puppeteer library useful not only for performing end-to-end testing but also for doing different kinds of browser automation. Puppeteer is backed by Google and is actively maintained, so be sure to check its docs to understand the wide-ranging use cases it offers.

You can find the code for this tutorial on GitHub.

Akshay is a creator, computer artist and micropreneur from Mumbai.

178 comments

  1. I’ve been browsing online more than 4 hours today, yet I never found any interesting article like yours.
    It’s pretty worth enough for me. Personally, if all site
    owners and bloggers made good content as you did, the internet will be much more useful than ever before.

  2. Ahaa, its good dialogue on the topic of this piece of writing at this place at
    this blog, I have read all that, so at this time me also
    commenting here.

  3. Hi there! This is kind of off topic but I need some help from an established blog.
    Is it difficult to set up your own blog? I’m not very techincal
    but I can figure things out pretty quick. I’m thinking about
    making my own but I’m not sure where to start. Do you
    have any points or suggestions? Appreciate it

    Feel free to visit my web page; frun-test.sakura.ne.jp

  4. Great post. I was checking constantly this blog and I am impressed!
    Very useful information specifically the final section 🙂 I handle such info much.
    I used to be looking for this certain information for a very lengthy
    time. Thanks and best of luck.

    My web-site: playboy2 ios download

  5. Thanks for the good writeup. It actually was once a entertainment account it.
    Look complicated to more brought agreeable from you!
    However, how can we keep up a correspondence?

    my blog post :: sky777

  6. Excellent post. I was checking continuously this weblog and I am inspired!
    Extremely helpful info particularly the remaining part 🙂 I care for such info a lot.
    I used to be looking for this particular info
    for a very long time. Thank you and best of luck.

    Feel free to visit my site greatwall99apk android

  7. Hello there! This blog post could not be written any better!

    Going through this post reminds me of my previous roommate!

    He constantly kept preaching about this. I will send this post to him.
    Pretty sure he will have a good read. Thank you for sharing!

  8. Saya akan segera pegang rss feed Anda karena saya tidak bisa
    Sangat keren! Beberapa poin yang
    Hai, Saya percaya ini luar biasa situs web . Saya tersandung;) Saya akan kembali
    lagi karena saya bertanda buku itu. Uang dan kebebasan adalah yang terbesar cara untuk berubah, semoga Anda kaya dan terus membimbing orang lain.

    Feel free to visit my webpage; joker123 terbaru

  9. What’s up every one, here every one is sharing such knowledge, thus it’s good to
    read this webpage, and I used to pay a visit this website
    daily.

    Have a look at my web site … kebe.top

  10. I think this is one of the most vital info for me. And i’m
    glad reading your article. But want to remark on few general things, The web site style is
    perfect, the articles is really excellent : D. Good job, cheers

    Look into my blog … dysonvacuumdc24.com

  11. Very good website you have here but I was wanting to know if you
    knew of any message boards that cover the same topics discussed in this article?
    I’d really love to be a part of community where I can get suggestions from other experienced people that
    share the same interest. If you have any suggestions, please
    let me know. Many thanks!

    Here is my page: mpc-install.com

  12. I in addition to my guys appeared to be checking the great hints located on the website and
    so unexpectedly I had a terrible suspicion I never thanked the blog owner for those strategies.
    The boys are actually for this reason excited to read through all of them and
    already have seriously been having fun with them.
    We appreciate you truly being well helpful and also for obtaining this kind of tremendous themes millions of individuals are really desperate to
    be aware of. Our own sincere apologies for not expressing appreciation to sooner.

    Here is my web blog :: frun-test.sakura.ne.jp

  13. Howdy! Do you know if they make any plugins to help with Search
    Engine Optimization? I’m trying to get my blog to rank for some targeted keywords but I’m not seeing
    very good results. If you know of any please share. Thank you!

    Here is my web-site anapa-alrosa.com.ru

  14. With havin so much content and articles do you ever run into any
    issues of plagorism or copyright violation? My website has a lot
    of completely unique content I’ve either authored myself or outsourced but
    it appears a lot of it is popping it up all over the web without my agreement.

    Do you know any solutions to help prevent content from being ripped
    off? I’d certainly appreciate it.

    Also visit my blog … https://next360.com/index.php?action=profile;u=104628

  15. Does your blog have a contact page? I’m having
    trouble locating it but, I’d like to shoot you an email. I’ve got some ideas for your blog
    you might be interested in hearing. Either way, great website and
    I look forward to seeing it develop over time.

    Feel free to visit my website: http://www.aniene.net

  16. I truly love your blog.. Great colors & theme. Did you develop this
    site yourself? Please reply back as I?m trying to create my own blog
    and would love to find out where you got this from or just what the theme is called.
    Thank you!

    my homepage: Gidget

  17. I hardly write remarks, however i did a few searching
    and wound up here Learn End-to-end Testing with Puppeteer – Pavvy Designs.
    And I actually do have some questions for you if it’s allright.
    Is it only me or does it look as if like a few of these remarks look like they are left by brain dead
    folks? 😛 And, if you are posting at other sites, I would like
    to keep up with everything fresh you have to post.

    Could you list of all of all your communal pages
    like your Facebook page, twitter feed, or linkedin profile?

    Take a look at my blog post; motofon.net

  18. Thanks a lot for sharing this with all people you really recognise
    what you’re speaking about! Bookmarked. Please also talk over with my site =).
    We will have a link change contract between us!

    my webpage zgyssyw.com

  19. Usually I do not learn post on blogs, however I would
    like to say that this write-up very forced me to try and do
    so! Your writing taste has been amazed me. Thanks, quite nice
    post.

    Also visit my page returngain.com

  20. Hello there, just became alert to your blog through Google, and found that it’s really informative.
    I am gonna watch out for brussels. I will be grateful if you continue this in future.
    Numerous people will be benefited from your writing.
    Cheers!

    Here is my homepage; kebe.top

  21. Hi! Do you use Twitter? I’d like to follow you if that would be ok.

    I’m definitely enjoying your blog and look forward to new updates.

    my website :: Ashley

  22. Undeniably believe that which you stated. Your favorite justification seemed to be on the web the simplest thing to
    be aware of. I say to you, I certainly get irked even as folks think about issues that they just don’t recognise about.
    You controlled to hit the nail upon the highest and outlined out the
    entire thing without having side effect , other people
    can take a signal. Will probably be again to get
    more. Thanks

    Also visit my web page … http://pansionat.com.ru

  23. Hello there I am so excited I found your site, I really found
    you by mistake, while I was researching on Askjeeve for something else,
    Anyways I am here now and would just like to say many thanks for a tremendous post
    and a all round enjoyable blog (I also love the theme/design), I don?t have time to browse it all at the moment but I have bookmarked it and also added in your RSS feeds, so when I have time I will be back to read
    much more, Please do keep up the superb jo.

    My web blog :: https://kebe.top/viewtopic.php?id=1913565

  24. Do you mind if I quote a couple of your posts as long as I provide credit and sources back to your weblog?
    My blog site is in the very same area of interest as yours and my
    visitors would truly benefit from a lot of the information you provide here.

    Please let me know if this alright with you.
    Appreciate it!

    My webpage :: http://www.lubertsi.net

  25. Hey! I just wanted to ask if you ever have any issues with hackers?
    My last blog (wordpress) was hacked and I ended up
    losing several weeks of hard work due to no back up.

    Do you have any solutions to prevent hackers?

  26. Hey! Quick question that’s entirely off topic. Do you know how to make
    your site mobile friendly? My website looks weird when browsing from my iphone 4.

    I’m trying to find a template or plugin that might be able to
    fix this problem. If you have any recommendations, please share.
    Appreciate it!

    Look into my blog post :: https://mpc-install.com/

  27. Unquestionably imagine that that you said. Your favourite justification appeared to be at the net the
    easiest thing to have in mind of. I say to you, I definitely get irked while folks think about
    concerns that they just don’t recognise about.
    You managed to hit the nail upon the highest as smartly as defined out the
    whole thing without having side-effects , other folks
    could take a signal. Will likely be again to get more. Thank you

    Here is my web page – mpc-install.com

  28. I like what you guys are up also. Such intelligent work
    and reporting! Carry on the excellent works guys I have incorporated you guys to my blogroll.

    I think it’ll improve the value of my site :).

    My web page … tanglewood.sh

  29. Thank you for some other magnificent post. Where else may just anyone get
    that type of information in such a perfect means of writing?
    I’ve a presentation subsequent week, and I’m on the look for
    such info.

    Here is my website: Nydia

  30. I like what you guys are up too. Such smart work and reporting!

    Carry on the excellent works guys I’ve incorporated you guys to my blogroll.
    I think it will improve the value of my website
    :).

    My page – kebe.top

  31. May I simply say what a comfort to find an individual who genuinely
    understands what they are talking about over the internet.

    You definitely know how to bring a problem to light and make it important.
    More people should read this and understand this side of the story.
    I was surprised you’re not more popular since you most certainly have the
    gift.

    Also visit my page http://www.craksracing.com/modules.php?name=Your_Account&op=userinfo&username=BogartTeddy

  32. Do you mind if I quote a few of your articles as long as
    I provide credit and sources back to your site? My website is in the very same area of interest as yours and my visitors would certainly benefit
    from some of the information you provide here. Please let me know if this ok with you.
    Thank you!

    Here is my web-site; Tiffiny

  33. hello there and thank you for your information ?
    I?ve definitely picked up anything new from right here.
    I did however expertise a few technical points using this web site, as I experienced to reload the website many
    times previous to I could get it to load correctly.
    I had been wondering if your web hosting is OK? Not that I am complaining, but
    sluggish loading instances times will often affect your
    placement in google and could damage your quality score if ads and marketing with Adwords.
    Well I?m adding this RSS to my e-mail and can look out for much more of your respective fascinating content.
    Ensure that you update this again very soon..

    my web-site: http://www.atomy123.com

  34. I’ve been browsing on-line more than 3 hours today, yet I never found any fascinating article like yours.
    It is beautiful price sufficient for me.
    Personally, if all website owners and bloggers made excellent content material as you did, the web shall be much more helpful than ever before.

    Here is my page; http://www.qijiang520.com

  35. As I website possessor I believe the content material here
    is rattling wonderful , appreciate it for your
    hard work. You should keep it up forever! Good Luck.

    My webpage … Brooke

  36. An outstanding share! I have just forwarded this onto a co-worker who had been doing a little
    homework on this. And he actually bought me lunch due
    to the fact that I discovered it for him… lol.
    So allow me to reword this…. Thanks for the meal!!
    But yeah, thanks for spending some time to talk
    about this topic here on your web site.

    Also visit my web-site; chengdian.cc

  37. This is very attention-grabbing, You are a very skilled blogger.
    I have joined your rss feed and look ahead to looking for more of your great post.
    Additionally, I’ve shared your site in my social networks

    My web page magus01.uw.hu

  38. Hey! Someone in my Myspace group shared this website with us so I came
    to look it over. I’m definitely loving the information. I’m bookmarking and will be tweeting this to my followers!
    Excellent blog and outstanding style and design.

    Visit my web blog :: kebe.top

  39. Outstanding post, I conceive people should larn a lot from this site its real user friendly.
    So much great information on here :D.

    Here is my webpage … Barbra

  40. Greetings! Quick question that’s entirely off topic.
    Do you know how to make your site mobile friendly?

    My web site looks weird when viewing from my iphone 4. I’m trying to find a template or plugin that might be able to
    resolve this issue. If you have any suggestions, please share.
    Thanks!

    my web-site: https://lovegamematch.com/

  41. It’s really very complicated in this busy life to
    listen news on TV, therefore I simply use world wide web for that reason, and obtain the newest news.

    my website :: kebe.top

  42. It’s really a great and useful piece of info.

    I am satisfied that you just shared this helpful info with
    us. Please keep us up to date like this. Thanks for sharing.

    Feel free to visit my web-site: Tri-Bol Testo

  43. I love what you guys tend to be up too. This kind of clever work and coverage!
    Keep up the awesome works guys I’ve added you guys to blogroll.

    Take a look at my site … Kodo Detox

  44. Great goods from you, man. I have understand your stuff previous to and you are just too wonderful.

    I actually like what you have acquired here, really like what you’re
    stating and the way in which you say it. You make
    it entertaining and you still care for to keep it smart.
    I can not wait to read far more from you.
    This is actually a terrific website.

    My web-site; http://www.aniene.net/

  45. I actually wanted to jot down a quick remark to appreciate you for all of
    the stunning ideas you are giving on this website. My time-consuming internet
    look up has finally been rewarded with brilliant facts
    and strategies to go over with my classmates and friends.
    I ‘d claim that we readers are very much blessed to dwell in a decent place with many
    brilliant individuals with interesting tricks. I feel truly blessed to have discovered your entire webpages and
    look forward to many more awesome times reading here. Thanks a lot once more for a lot of things.

    my homepage: mpc-install.com

  46. Magnificent goods from you, man. I’ve understand your stuff previous to and you are just extremely magnificent.

    I actually like what you have acquired here, really like what
    you’re saying and the way in which you say it. You make it entertaining and
    you still take care of to keep it wise. I can’t wait to read far more from you.
    This is actually a terrific web site.

    Also visit my web blog … http://www.chubbychannel.com

  47. My programmer is trying to persuade me to move to .net from PHP.
    I have always disliked the idea because of the costs.
    But he’s tryiong none the less. I’ve been using Movable-type on a variety of websites for about a year and am anxious about switching to another
    platform. I have heard fantastic things about blogengine.net.
    Is there a way I can transfer all my wordpress
    posts into it? Any help would be really appreciated!

    Look at my site … Tri-Bol Testo Pills

  48. I simply wanted to compose a small note to say thanks to you for all of
    the superb advice you are showing at this website.

    My long internet research has at the end been recognized with
    reliable points to exchange with my family.

    I ‘d tell you that most of us website visitors actually are undoubtedly
    blessed to dwell in a decent network with so many
    outstanding people with good hints. I feel very lucky to have used the site and look forward to plenty of more enjoyable times reading here.
    Thanks again for a lot of things.

    Also visit my web blog; Tri-Bol Testo Male Enhancement

  49. Hi there i am kavin, its my first occasion to commenting anyplace, when i read this post i thought i could also make comment due to this sensible post.

    Feel free to visit my web blog: Breeze Tech

  50. Thank you so much for providing individuals with
    a very pleasant chance to read in detail from this blog.

    It’s always so terrific and also stuffed with amusement for
    me personally and my office fellow workers to visit the blog
    a minimum of three times in 7 days to read the latest issues you will have.
    Not to mention, I’m usually astounded with the incredible methods you serve.
    Selected 3 ideas on this page are surely the
    very best I have ever had.

    My homepage :: Tri-Bol Testo Review

  51. I simply needed to thank you very much yet again.
    I do not know the things that I would’ve made to happen in the absence of these smart
    ideas shared by you relating to such a area. It was actually a
    real distressing issue for me, however , considering your expert
    fashion you solved the issue forced me to leap over fulfillment.
    Now i am happy for the help as well as hope that you find
    out what an amazing job you happen to be providing educating
    the mediocre ones by way of your webpage. More than likely you haven’t got to know
    all of us.

    my page meteoritegarden.com

  52. Hi, i read your blog from time to time and i own a similar one and i was just
    wondering if you get a lot of spam comments? If so how do you prevent it,
    any plugin or anything you can recommend? I get so much lately it’s driving me insane so any help is very much
    appreciated.

    Here is my blog post … dosurveys4cash.co.za

  53. I still can’t quite believe that I could become one of those reading the important
    recommendations found on your website. My family and I are truly thankful for the generosity and for offering me the chance to pursue my personal chosen profession path.
    Many thanks for the important information I obtained from your web page.

    Feel free to surf to my page: Rhino Spark Review

  54. I am extremely inspired along with your writing abilities and also with the
    format to your weblog. Is that this a paid topic or did you modify it your self?
    Either way keep up the nice high quality writing, it’s rare to look a nice weblog
    like this one these days..

    My web page – VikingXL

  55. Excellent goods from you, man. I’ve be aware your stuff previous to and you’re just too wonderful.
    I really like what you have got right here, really like what
    you are stating and the best way in which you are saying it.
    You make it entertaining and you continue to care for to keep it sensible.
    I can’t wait to learn far more from you. This is really
    a terrific web site.

    Feel free to surf to my web-site :: deletedbyfacebook.com

  56. Hiya, I’m really glad I’ve found this information. Today bloggers publish only about gossips and web and this
    is actually irritating. A good site with interesting content, that’s what I need.
    Thanks for keeping this website, I’ll be visiting it.
    Do you do newsletters? Cant find it.

    My webpage :: Pellamore

  57. I’m not sure where you are getting your info, but great topic.
    I needs to spend some time learning more or understanding more.
    Thanks for great info I was looking for this info for my mission.

    my blog post – Wawza Gummies

  58. I’d been honored to obtain a call coming from a friend as
    he observed the important suggestions shared in your site.
    Going through your blog article is a real excellent experience.
    Thanks again for taking into account readers like me,
    and I want for you the best of achievements as being a professional in this
    surface area.

    Visit my blog post – http://vbriudaipur.org

  59. Its like you read my mind! You appear to know so much
    about this, like you wrote the book in it or something.
    I think that you could do with a few pics to drive the message home a little bit, but other than that, this
    is magnificent blog. A fantastic read. I will definitely
    be back.

    Feel free to visit my web blog Rapid Fire Keto Reviews

  60. I’m amazed, I must say. Seldom do I come across a blog that’s both equally educative
    and amusing, and without a doubt, you’ve hit the nail on the
    head. The problem is something that not enough people are speaking intelligently
    about. I am very happy I stumbled across this during my hunt for something regarding this.

  61. Pingback: clonidine hcl
  62. Pingback: carvedilol 25 mg
  63. Pingback: aciclovir
  64. Pingback: vardenafil 10mg
  65. Pingback: cialis effects
  66. Pingback: viagra for females

Leave a Reply

Your email address will not be published.