npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

appdriver

v1.0.0-beta.2

Published

[![NPM Version](https://img.shields.io/npm/v/appdriver.svg?style=flat)](https://www.npmjs.com/package/appdriver) [![GitHub License](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/lewie9021/appdriver/blob/master/LICENSE.md)

Downloads

6

Readme

AppDriver

NPM Version GitHub License

A mobile focused test automation framework.

Get Started | API Reference | Native Demo App | Change Log

Notices

This project is currently in the Beta stages of development, meaning the framework is capable of handling general use cases but may be lacking some functionality, documentation and stability. If you're interested in the project's roadmap, feel free to check out the Projects tab.

Goal

The goal of this project is to offer a mobile focused E2E testing framework that's "batteries included". It should provide a familiar interface for running tests, an assertion library orientated around E2E testing, and first class support for common operations.

Motivation

After using WebdriverIO for over a year on a real world project, I found it frustrating to perform even basic tasks without spending hours writing helper function(s) or helplessly trying to figure out how to use the framework in the context of Appium.

The major Webdriver clients focus too heavily on the Web, giving the impression that mobile (via Appium) is an afterthought. I was frequently forced down a trial and error path as the documentation was either sparse or simply non-existent.

Initially, I started this project as a proof of concept, taking inspiration from Detox, WebdriverIO, WD.js, and Jest. I really liked the syntactic style of Detox and wanted to see how it might look when paired with the (Mobile) JSON Wire Protocol.

Unlike Webdriver clients, Detox is yet to support testing in the cloud and on real iOS devices. For me, this was a limitation I simply couldn't ignore. I feel it's critical in ensuring tests run quickly and provide the confidence that the application works as expected on a variety of real devices.

Examples

Tap interaction
(async () => {
  await element(by.label("button")).tap();
})();
Text entry
(async () => {
  const $textInput = await element(by.label("text-input"));
  
  await $textInput
    .tap()
    .typeText("Hello World!");
  
  await expect($textInput).toHaveValue("Hello World!");
})();
Swipe gesture
(async () => {
  await element(by.label("carousel-container"))
    .swipeLeft({ percentage: 0.75 });
  
  await expect(element(by.label("carousel-page-2"))).toBeVisible();
})();
Regex element matching
(async () => {
  const $items = await elements(by.label(/list-item-.*/));
  
  await expect($items).toHaveLength(3);
})();
Custom gestures
(async () => {
  const $box = await element(by.label("box"));
  const { x, y } = await $box.getLocation({ relative: true });
 
  const tap = gestures.series([
    gestures.moveTo({ x, y }),
    gestures.press(),
    gestures.wait(100),
    gestures.release()
  ]);
  
  await device.performGesture(tap);
})();