$ composer require "behat/behat"
"require": { "behat/behat" : "^3.4", "behat/mink-extension" : "2.2", "behat/mink-selenium2-driver" : "^1.3" }
default: # «» autoload: '': '%paths.base%/src/Context' suites: # facebook_suite: # () , Gherkin language paths: - '%paths.base%/scenario/facebook' contexts: # «» . # API - Dossier\Context\FacebookContext: # FacebookContext base_url: 'https://www.facebook.com/' user: 'email@gmail.com' pass: 'password' vk_suite: paths: - '%paths.base%/scenario/vk' contexts: - Dossier\Context\VkContext: # - "@lookup" services: # lookup: 'Dossier\Context\AccessLimit\Lookup' extensions: # , behat Behat\MinkExtension: browser_name: 'chrome' default_session: 'selenium2' selenium2: # Selenium . IP ( localhost ) wd_host: 'http://172.17.0.1:4444/wd/hub' # browser: chrome
$ docker run -d -p 4444:4444 -p 5900:5900 -v /dev/shm:/dev/shm selenium/standalone-chrome-debug:3.11.0-californium
version: '2' services: selenium: image: selenium/standalone-chrome-debug:3.11.0 ports: - "4444:4444" - "5900:5900" volumes: - /dev/shm:/dev/shm network_mode: "host"
$ docker-compose up
Feature: Facebook Parse In order parse fb @first-level Scenario: Find person in facebook Given I am on "https://facebook.com/" When I fill in "email" with "some@gmail.com" And I fill in "pass" with "somepass" # Then I press tricky facebook login button Then I should see "" # Then I am searching by input params Then I dump users
class FacebookContext extends MainContext { /** * @Then /^I press tricky facebook login button$/ */ public function pressFacebookButton() { $this->getSession()->getPage()->find( 'css', 'input[data-testid="royal_login_button"]' )->click(); } /** * . , , . * @Then /^I dump users$/ */ public function dumpUsers() { $session = $this->getSession(); $users = $this->getSession()->getPage()->findAll( 'xpath', $session->getSelectorsHandler() ->selectorToXpath('css', 'div._4p2o') ); if (!$users) { throw new \InvalidArgumentException("The user with this name was not found"); } $collection = new UserCollection('facebook_suite'); foreach ($users as $user) { $img = $user->find('xpath', $session->getSelectorsHandler() ->selectorToXpath( 'xpath', $session->getSelectorsHandler()->selectorToXpath('css', 'img') )); $link = $user->find('xpath', $session->getSelectorsHandler() ->selectorToXpath( 'xpath', $session->getSelectorsHandler()->selectorToXpath('css','a._32mo') )); $outputInfo = new OutputUserInfo('facebook_suite'); $outputInfo->setName($link ? $link->getText(): '') ->addPublicLinks($link ? $link->getAttribute('href') : '') ->setPhoto($img ? $img->getAttribute('src') : ''); $collection->append($outputInfo); } $this->saveDump($collection); } /** * URL * @Then /^I am searching by input params$/ */ public function search() { if (!Registry::has('query')) { throw new \BadMethodCallException('No search query received'); } $criteria = Registry::get('query'); $this->getSession()->visit("https://www.facebook.com/search/people/?q=" . urldecode($criteria->getQuery())); } }
$ vendor/bin/behat
use Behat\Behat\Gherkin\ServiceContainer\GherkinExtension; use Behat\Testwork\Cli\ServiceContainer\CliExtension; use Behat\Testwork\ServiceContainer\Extension; use Behat\Testwork\ServiceContainer\ExtensionManager; use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; class SearchExtension implements Extension { /** * Extensions */ public function process(ContainerBuilder $container) { } /** * behat.yml * @return string */ public function getConfigKey() { return 'search'; } /** * , * configure(). * * @param ExtensionManager $extensionManager */ public function initialize(ExtensionManager $extensionManager){} /** * * @param ArrayNodeDefinition $builder */ public function configure(ArrayNodeDefinition $builder){ } /** * * @param ContainerBuilder $container * @param array $config */ public function load(ContainerBuilder $container, array $config) { $definition = new Definition('Dossier\BehatSearch\SearchController', array( new Reference(GherkinExtension::MANAGER_ID) )); $definition->addTag(CliExtension::CONTROLLER_TAG, array('priority' => 1)); $container->setDefinition( CliExtension::CONTROLLER_TAG .' . search', $definition ); } }
use Behat\Testwork\Cli\Controller; use Dossier\Registry; use Dossier\User\Criteria\FullnameCriteria; use Symfony\Component\Console\Command\Command as SymfonyCommand; use Symfony\Component\Console\Exception\InvalidOptionException; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; use Symfony\Component\Console\Output\OutputInterface; class SearchController implements Controller { const SEARCH_BY_FULLNAME = 'search-by-fullname'; /** * Configures command to be executable by the controller. * @param SymfonyCommand $command */ public function configure(SymfonyCommand $command) { $command->addOption( '--' . self::SEARCH_BY_FULLNAME, null, InputOption::VALUE_OPTIONAL, "Specify the search query based on fullname of the user. Must be started from surname" ); } /** * Executes controller. * * @param InputInterface $input * @param OutputInterface $output * * @return null|integer */ public function execute(InputInterface $input, OutputInterface $output) { $reflect = new \ReflectionClass(__CLASS__); foreach ($reflect->getConstants() as $constName => $option) { if ($input->hasOption($option) && ($optValue = $input->getOption($option))) { $queryArgs = explode(',', $optValue); Registry::set('query', new FullnameCriteria( $queryArgs[0], $queryArgs[1] ?? null, $queryArgs[2] ?? null) ); return null; } } throw new \InvalidOptionException("You must specify one of the following options to proceed: " . implode(', ', $reflect->getConstants())); } }
$ vendor/bin/behat --help
[mkardakov@mkardakov-local dossier.io]$ vendor/bin/behat --help | grep search-by-fullname --search-by-fullname[=SEARCH-BY-FULLNAME] Specify the search query based on fullname of the user. Must be started from surname [mkardakov@mkardakov-local dossier.io]$
Source: https://habr.com/ru/post/353612/
All Articles