Best Atoum code snippet using token.getParent
Processor.php
Source:Processor.php
...21 $tmp = $child->getNextSibling();22 if( $tmp && $tmp->getCode() != T_WLG_PAREN_START ) {23 $next = $child->getNextSiblingOfType(array(T_CLOSE_TAG, T_WLG_STATEMENT_SEPARATOR, T_INLINE_HTML));24 if( $next ) {25 $child->getParent()->addChildAfter(Engine_Template_Token::fromInteger(T_WLG_PAREN_START, '('), $child);26 $child->getParent()->addChildBefore(Engine_Template_Token::fromInteger(T_WLG_PAREN_STOP, ')'), $next);27 }28 }29 }30 // Fourth pass - attempt to convert parentheses31 $newRootNode = Engine_Template_Token::fromInteger(T_WLG_ROOT);32 $currentNode = $newRootNode;33 foreach( $rootNode->getChildren() as $child ) {34 if( $child->getCode() == T_WLG_PAREN_START ) {35 $tmp = Engine_Template_Token::fromInteger(T_WLG_EXPRESSION);36 $currentNode->addChild($tmp);37 $currentNode = $tmp;38 $rootNode->removeChild($child); // :S39 $currentNode->addChild($child);40 } else if( $child->getCode() == T_WLG_PAREN_STOP ) {41 $rootNode->removeChild($child); // :S42 $currentNode->addChild($child);43 $currentNode = $currentNode->getParent();44 if( null === $currentNode ) {45 throw new Exception('Parse error!');46 }47 } else {48 $rootNode->removeChild($child); // :S49 $currentNode->addChild($child);50 }51 }52 $rootNode = $newRootNode;53 // Fifth pass - Add statement separators before close tags where applicable54 foreach( $rootNode->getChildrenByCode(T_CLOSE_TAG) as $child ) {55 $prev = $child->getPreviousSibling();56 if( $prev && !in_array($prev->getCode(), array(T_WLG_STATEMENT_SEPARATOR, T_WLG_BRACE_START, T_WLG_BRACE_STOP, T_WLG_KEYWORD_START)) ) {57 $rootNode->addChildBefore(Engine_Template_Token::fromInteger(T_WLG_STATEMENT_SEPARATOR, ';'), $child);58 }59 }60 // Sixth pass - convert nasty template blocks to normal braces61 $newRootNode = Engine_Template_Token::fromInteger(T_WLG_ROOT);62 $currentNode = $newRootNode;63 foreach( $rootNode->getChildren() as $child ) {64 $doAddChild = true;65 if( $child->getCode() == T_WLG_KEYWORD_START ) {66 $prev = $child->getPreviousSibling();67 if( $prev && $prev->getCode() == T_WLG_EXPRESSION ) {68 $prev = $prev->getPreviousSibling();69 }70 if( $prev ) {71 switch( $prev->getCode() ) {72 case T_FOR:73 case T_FOREACH:74 case T_WHILE:75 case T_IF:76 $doAddChild = false;77 $newRootNode->addChild(Engine_Template_Token::fromInteger(T_WLG_BRACE_START, '{'));78 break;79 case T_ELSE:80 case T_ELSEIF:81 $doAddChild = false;82 $newRootNode->addChild(Engine_Template_Token::fromInteger(T_WLG_BRACE_START, '{'));83 $newRootNode->addChildBefore(Engine_Template_Token::fromInteger(T_WLG_BRACE_STOP, '}'), $prev);84 break;85// case T_ENDDECLARE:86// case T_ENDFOR:87// case T_ENDFOREACH:88// case T_ENDIF:89// case T_ENDSWITCH:90// case T_ENDWHILE:91// $newRootNode->addChildBefore(Engine_Template_Token::fromInteger(T_WLG_BRACE_STOP, '}'), $prev);92// $newRootNode->removeChild($prev);93// break;94 }95 }96 } else if( in_array($child->getCode(), array(T_ENDDECLARE, T_ENDFOR, T_ENDFOREACH, T_ENDIF, T_ENDSWITCH, T_ENDWHILE)) ) {97 $newRootNode->addChild(Engine_Template_Token::fromInteger(T_WLG_BRACE_STOP, '}'));98 $newRootNode->removeChild($child);99 $doAddChild = false;100 }101 if( $doAddChild ) {102 $newRootNode->addChild($child);103 }104 }105 $rootNode = $newRootNode;106 107 // Seventh pass - attempt to convert braces108 $newRootNode = Engine_Template_Token::fromInteger(T_WLG_ROOT);109 $currentNode = $newRootNode;110 foreach( $rootNode->getChildren() as $child ) {111 if( $child->getCode() == T_WLG_BRACE_START ) {112 $tmp = Engine_Template_Token::fromInteger(T_WLG_BLOCK);113 $currentNode->addChild($tmp);114 $currentNode = $tmp;115 $rootNode->removeChild($child); // :S116 $currentNode->addChild($child);117 } else if( $child->getCode() == T_WLG_BRACE_STOP ) {118 $rootNode->removeChild($child); // :S119 $currentNode->addChild($child);120 121 $currentNode = $currentNode->getParent();122 if( null === $currentNode ) {123// echo "<pre>";124// echo $newRootNode->outputDebug();125// die();126 throw new Exception('Parse error!');127 }128 } else {129 $rootNode->removeChild($child); // :S130 $currentNode->addChild($child);131 }132 }133 $rootNode = $newRootNode;134 135// echo "<pre>" . PHP_EOL . PHP_EOL;136// echo $rootNode->outputDebug();137// echo "<hr>" . PHP_EOL . PHP_EOL;138// echo $rootNode->output();139// echo "<hr>" . PHP_EOL . PHP_EOL;140// echo self::toJavascript($rootNode);141// die();142 143 return $rootNode;144 }145 static public function toJavascript($node)146 {147 if( $node->getCode() == T_WLG_ROOT ) {148 self::$_indentLevel = 0;149 }150 if( $node->getSkipRender() ) {151 return '';152 }153 154 $content = self::getJavascriptToken($node);155 if( $node->getSkipRender() ) {156 return $content;157 }158 foreach( $node->getChildren() as $child ) {159 $content .= self::toJavascript($child);160 }161 return $content;162 }163 static public function getJavascriptToken($node)164 {165 $value = $node->getValue();166 $code = $node->getCode();167 $indent = 0;168 switch( $code ) {169 case T_ARRAY:170 $value = ''; // ignore171 break;172 case T_CLOSE_TAG:173 $value = ''; // . "\n";174 //$indent = 1;175 break;176 case T_DOC_COMMENT:177 $value = '';178 break;179 case T_DOUBLE_ARROW:180 $value = ' ' . ':' . ' ';181 break;182 case T_DOUBLE_COLON:183 $value = '.';184 break;185 case T_ECHO:186 $value = 'this.append';187 break;188 case T_ELSE:189 $value = ' else ';190 break;191 case T_ELSEIF:192 $value = ' else if ';193 break;194 case T_EMPTY:195 $value = 'this.empty';196 break;197 case T_FOREACH:198 $expression = $node->getNextSibling();199 if( $expression && $expression->getCode() == T_WLG_EXPRESSION ) {200 $block = $expression->getNextSibling();201 if( $block && $block->getCode() == T_WLG_BLOCK ) {202 // Process the expression203 $refPStart = $expression->getChildByCode(T_WLG_PAREN_START);204 $refPStop = $expression->getChildByCode(T_WLG_PAREN_STOP);205 $refAs = $expression->getChildByCode(T_AS);206 $refArrow = $expression->getChildByCode(T_DOUBLE_ARROW);207 if( !$refAs ) {208 throw new Exception('Translation error!');209 }210 $expr1 = $expression->getChildrenBetween($refPStart, $refAs, false);211 if( $refArrow ) {212 $expr3 = $expression->getChildrenBetween($refAs, $refArrow, false);213 $expr2 = $expression->getChildrenBetween($refArrow, $refPStop, false);214 } else {215 $expr3 = null;216 $expr2 = $expression->getChildrenBetween($refAs, $refPStop, false);217 }218 $expression->removeChildren($refAs);219 if( $refArrow ) {220 $expression->removeChildren($refArrow);221 }222 $expression->removeChildren($expr2);223 if( $expr3 ) {224 $expression->removeChildren($expr3);225 }226 // Ugly hack227 $expression->addChild(Engine_Template_Token::fromInteger(T_OBJECT_OPERATOR, '->'));228 $expression->addChild(Engine_Template_Token::fromInteger(T_STRING, 'each(function('));229 foreach( $expr2 as $t ) {230 $expression->addChild($t);231 }232 if( $expr3 ) {233 $expression->addChild(Engine_Template_Token::fromInteger(T_WLG_LIST_SEPARATOR, ','));234 foreach( $expr3 as $t ) {235 $expression->addChild($t);236 }237 }238 $expression->addChild(Engine_Template_Token::fromInteger(T_STRING, ') '));239 $block->getChildByCode(T_WLG_BRACE_STOP)->addChild(Engine_Template_Token::fromInteger(T_STRING, '.bind(this)'));240 $block->getChildByCode(T_WLG_BRACE_STOP)->addChild(Engine_Template_Token::fromInteger(T_STRING, ')'));241 $block->getChildByCode(T_WLG_BRACE_STOP)->addChild(Engine_Template_Token::fromInteger(T_WLG_STATEMENT_SEPARATOR, ';'));242// $expression->getParent()->addChildAfter(Engine_Template_Token::fromInteger(T_OBJECT_OPERATOR, '->'), $expression);243// $expression->getParent()->addChildAfter(Engine_Template_Token::fromInteger(T_STRING, '->'), $expression);244// echo $expression->getParent()->outputDebug();245// die();246 $value = '';247 }248 }249 break;250 case T_INLINE_HTML:251 $value = 'this.append(' . json_encode($value) . ');';252 //$value .= "\n";253 $indent = 1;254 break;255 case T_ISSET:256 $value = 'this.isset';257 break;258 case T_OBJECT_OPERATOR:259 $value = '.';260 break;261 case T_OPEN_TAG:262 $value = '';263 break;264 case T_STRING:265 $prev = $node->getPreviousElement();266 if( $prev && $prev->getCode() == T_OBJECT_OPERATOR ) {267 $prev2 = $prev->getPreviousElement();268 if( $prev2 && $prev2->getCode() == T_VARIABLE && $prev2->getValue() == '$this' ) {269 // Check if next is paren270 $next = $node->getNextElement();271 if( $next && $next->getCode() != T_WLG_PAREN_START ) {272 $value = 'get("' . $value . '")';273 } else if( !in_array($value, array('append', 'print', 'assign',274 'log', 'empty', 'isset', 'isJavascript')) ) {275 // Inject actual function name as first argument276 // Only add comma if there are other children277 if( count($next->getParent()->getChildren()) > 0 &&278 $next->getNextElement()->getCode() != T_WLG_PAREN_STOP ) {279 $next->getParent()->addChildAfter(Engine_Template_Token::fromInteger(T_WLG_LIST_SEPARATOR, ','), $next);280 }281 $next->getParent()->addChildAfter(Engine_Template_Token::fromInteger(T_CONSTANT_ENCAPSED_STRING, '"' . $value . '"'), $next);282 // Set self to call283 $value = 'call';284 }285 }286 }287 break;288 case T_WHITESPACE:289 if( true ) {290 // Skip?291 $value = '';292 } else {293 // Truncate to a single space?294 if( strlen($value) > 1 && $value[0] == ' ' ) {295 $value = ' ';296 }297 }298 break;299 case T_WLG_BRACE_START:300 self::$_indentLevel++;301 $indent = 1;302 break;303 case T_WLG_BRACE_STOP:304 self::$_indentLevel--;305 $tmp = $node->getNextElement();306 if( $tmp && in_array($tmp->getCode(), array(T_ELSE, T_ELSEIF)) ) {307 } else {308 $indent = 1;309 }310 break;311 case T_WLG_LIST_SEPARATOR:312 $value .= ' ';313 break;314 case T_WLG_PAREN_START:315 // If parent.previous was an array, change to {316 if( $node->getParent() &&317 ($tmp = $node->getParent()->getPreviousElement()) &&318 $tmp->getCode() == T_ARRAY) {319 $value = '{';320 }321 break;322 case T_WLG_PAREN_STOP:323 // If parent.previous was an array, change to }324 if( $node->getParent() &&325 ($tmp = $node->getParent()->getPreviousElement()) &&326 $tmp->getCode() == T_ARRAY) {327 $value = '}';328 }329 break;330 case T_WLG_STATEMENT_SEPARATOR:331 if( $node->getParent() &&332 ($tmp = $node->getParent()->getPreviousElement()) &&333 $tmp->getCode() == T_FOR ) {334 // ignore335 } else {336 $prev = $node->getPreviousElement();337 if( $prev && in_array($prev->getCode(), array(T_WLG_STATEMENT_SEPARATOR, T_WLG_BRACE_START, T_WLG_BRACE_STOP, T_WLG_KEYWORD_START)) ) {338 $value = '';339 }340 $indent = 1;341 }342 break;343 case T_VARIABLE:344 $value = ltrim($value, '$'); // strip $345 break;346 }...
tokenizer.php
Source:tokenizer.php
...51 $token = $this->tokens->current();52 switch ($token[0]) {53 case ';':54 case T_CLOSE_TAG:55 $this->currentIterator = $this->currentIterator->getParent();56 $inImportation = false;57 break;58 default:59 $this->currentIterator->append(new token($token[0], isset($token[1]) === false ? null : $token[1], isset($token[2]) === false ? null : $token[2]));60 $this->tokens->next();61 }62 $inImportation = $inImportation && $this->tokens->valid();63 }64 return $this->tokens->valid() === false ? null : $this->tokens->current();65 }66 private function appendNamespace()67 {68 $inNamespace = true;69 while ($inNamespace === true) {70 $token = $this->tokens->current();71 switch ($token[0]) {72 case T_NAMESPACE:73 $parent = $this->currentIterator->getParent();74 if ($parent !== null) {75 $this->currentIterator = $parent;76 }77 $this->currentIterator->appendNamespace($this->currentNamespace = new iterators\phpNamespace());78 $this->currentIterator = $this->currentNamespace;79 break;80 case T_CONST:81 $this->appendConstant();82 break;83 case T_FUNCTION:84 $this->appendFunction();85 break;86 case T_FINAL:87 case T_ABSTRACT:88 case T_CLASS:89 $this->appendClass();90 break;91 case T_INTERFACE:92 $this->appendInterface();93 break;94 case ';':95 $this->currentIterator = $this->currentIterator->getParent();96 $inNamespace = false;97 break;98 case T_CLOSE_TAG:99 if ($this->nextTokenIs(T_OPEN_TAG) === false) {100 $this->currentIterator = $this->currentIterator->getParent();101 $inNamespace = false;102 }103 break;104 case '}':105 $inNamespace = false;106 break;107 }108 $this->currentIterator->append(new token($token[0], isset($token[1]) === false ? null : $token[1], isset($token[2]) === false ? null : $token[2]));109 if ($token[0] === '}') {110 $this->currentIterator = $this->currentIterator->getParent();111 }112 $this->tokens->next();113 $inNamespace = $inNamespace && $this->tokens->valid();114 }115 return $this->tokens->valid() === false ? null : $this->tokens->current();116 }117 private function appendFunction()118 {119 $inFunction = true;120 $this->currentIterator->appendFunction($this->currentFunction = new iterators\phpFunction());121 $this->currentIterator = $this->currentFunction;122 while ($inFunction === true) {123 $token = $this->tokens->current();124 switch ($token[0]) {125 case '}':126 $inFunction = false;127 break;128 }129 $this->currentIterator->append(new token($token[0], isset($token[1]) === false ? null : $token[1], isset($token[2]) === false ? null : $token[2]));130 if ($token[0] === '}') {131 $this->currentIterator = $this->currentIterator->getParent();132 }133 $this->tokens->next();134 $inFunction = $inFunction && $this->tokens->valid();135 }136 return $this->tokens->valid() === false ? null : $this->tokens->current();137 }138 private function appendConstant()139 {140 $this->currentIterator->appendConstant($this->currentNamespace = new iterators\phpConstant());141 $this->currentIterator = $this->currentNamespace;142 $inConstant = true;143 while ($inConstant === true) {144 $token = $this->tokens->current();145 switch ($token[0]) {146 case ';':147 case T_CLOSE_TAG:148 $this->currentIterator = $this->currentIterator->getParent();149 $inConstant = false;150 break;151 default:152 $this->currentIterator->append(new token($token[0], isset($token[1]) === false ? null : $token[1], isset($token[2]) === false ? null : $token[2]));153 $this->tokens->next();154 }155 $inConstant = $inConstant && $this->tokens->valid();156 }157 return $this->tokens->valid() === false ? null : $this->tokens->current();158 }159 private function nextTokenIs($tokenName, array $skipedTags = [T_WHITESPACE, T_COMMENT, T_INLINE_HTML])160 {161 $key = $this->tokens->key() + 1;162 while (isset($this->tokens[$key]) === true && in_array($this->tokens[$key], $skipedTags) === true) {...
CollectionVoter.php
Source:CollectionVoter.php
...31 $isOwner = $userId && $subject->getOwnerId() === $userId;32 $workspaceIds = $userId ? $this->getAllowedWorkspaceIds($userId, $user->getGroupIds()) : [];33 switch ($attribute) {34 case self::CREATE:35 return $subject->getParent() ? $this->security->isGranted(CollectionVoter::EDIT, $subject->getParent())36 : $this->security->isGranted(WorkspaceVoter::EDIT, $subject->getWorkspace());37 case self::LIST:38 return $isOwner39 || $subject->getPrivacy() >= WorkspaceItemPrivacyInterface::PUBLIC40 || ($userId && $subject->getPrivacy() >= WorkspaceItemPrivacyInterface::PRIVATE)41 || (in_array($subject->getWorkspaceId(), $workspaceIds, true) && $subject->getPrivacy() >= WorkspaceItemPrivacyInterface::PRIVATE_IN_WORKSPACE)42 || $this->security->isGranted(PermissionInterface::VIEW, $subject)43 || (null !== $subject->getParent() && $this->security->isGranted($attribute, $subject->getParent()));44 case self::READ:45 return $isOwner46 || $subject->getPrivacy() >= WorkspaceItemPrivacyInterface::PUBLIC47 || ($userId && $subject->getPrivacy() >= WorkspaceItemPrivacyInterface::PUBLIC_FOR_USERS)48 || (in_array($subject->getWorkspaceId(), $workspaceIds, true) && $subject->getPrivacy() >= WorkspaceItemPrivacyInterface::PUBLIC_IN_WORKSPACE)49 || $this->security->isGranted(PermissionInterface::VIEW, $subject)50 || (null !== $subject->getParent() && $this->security->isGranted($attribute, $subject->getParent()));51 case self::EDIT:52 return $isOwner53 || $this->security->isGranted(PermissionInterface::EDIT, $subject)54 || ($subject->getParent() && $this->security->isGranted($attribute, $subject->getParent()));55 case self::DELETE:56 return $isOwner57 || $this->security->isGranted(PermissionInterface::DELETE, $subject)58 || (null !== $subject->getParent() && $this->security->isGranted($attribute, $subject->getParent()));59 case self::EDIT_PERMISSIONS:60 return $isOwner61 || $this->security->isGranted(PermissionInterface::OWNER, $subject)62 || (null !== $subject->getParent() && $this->security->isGranted($attribute, $subject->getParent()));63 }64 return false;65 }66}...
getParent
Using AI Code Generation
1$tokens = token_get_all(file_get_contents('1.php'));2foreach ($tokens as $token) {3 if (is_array($token)) {4 if ($token[0] == T_CLASS) {5 $classToken = $token;6 } else if ($token[0] == T_STRING && $classToken) {7";8 $classToken = null;9 }10 }11}12$tokens = token_get_all(file_get_contents('2.php'));13foreach ($tokens as $token) {14 if (is_array($token)) {15 if ($token[0] == T_CLASS) {16 $classToken = $token;17 } else if ($token[0] == T_STRING && $classToken) {18";19 $classToken = null;20 }21 }22}23$tokens = token_get_all(file_get_contents('3.php'));24foreach ($tokens as $token) {25 if (is_array($token)) {26 if ($token[0] == T_CLASS) {27 $classToken = $token;28 } else if ($token[0] == T_STRING && $classToken) {29";30 $classToken = null;31 }32 }33}34$tokens = token_get_all(file_get_contents('4.php'));35foreach ($tokens as $token) {36 if (is_array($token)) {37 if ($token[0] == T_CLASS) {38 $classToken = $token;39 } else if ($token[0] == T_STRING && $classToken) {40";41 $classToken = null;42 }43 }44}45$tokens = token_get_all(file_get_contents('5.php'));46foreach ($tokens as $token) {47 if (is_array($token)) {48 if ($token[0] == T_CLASS) {49 $classToken = $token;
getParent
Using AI Code Generation
1$tokens = token_get_all(file_get_contents('1.php'));2foreach ($tokens as $token) {3 if (is_array($token)) {4 $token = new Token($token);5 if ($token->is(T_VARIABLE)) {6 echo $token->getParent()->getName();7 }8 }9}10$test = 1;11$test2 = 2;12array Token::getChildren()13$test = 1;14$test2 = 2;15$tokens = token_get_all(file_get_contents('1.php'));16foreach ($tokens as $token) {17 if (is_array($token)) {18 $token = new Token($token);19 if ($token->is(T_VARIABLE)) {20 $children = $token->getChildren();21 foreach ($children as $child) {22 echo $child->getName();23 }24 }25 }26}27bool Token::isParenthesis()28$test = 1;29$test2 = 2;30$tokens = token_get_all(file_get_contents('1.php'));31foreach ($tokens as $token) {32 if (is
getParent
Using AI Code Generation
1$tokens = token_get_all(file_get_contents('1.php'));2foreach ($tokens as $token) {3 if (is_array($token)) {4 $token = $token[1];5 if ($token == 'parent') {6 echo 'Parent keyword found in line ', $token->getLine(), ' and column ', $token->getColumn(), "7";8 }9 }10}11Recommended Posts: PHP | token_get_all() Function12PHP | token_name() F
getParent
Using AI Code Generation
1$myToken = new Token();2$myToken->getParent();3$myToken = new Token();4$myToken->getChildren();5$myToken = new Token();6$myToken->getChildren();7$myToken = new Token();8$myToken->getChildren();9$myToken = new Token();10$myToken->getChildren();11$myToken = new Token();12$myToken->getChildren();13$myToken = new Token();14$myToken->getChildren();15$myToken = new Token();16$myToken->getChildren();17$myToken = new Token();18$myToken->getChildren();19$myToken = new Token();20$myToken->getChildren();21$myToken = new Token();22$myToken->getChildren();23$myToken = new Token();24$myToken->getChildren();25$myToken = new Token();26$myToken->getChildren();27$myToken = new Token();28$myToken->getChildren();
getParent
Using AI Code Generation
1$tokens = token_get_all(file_get_contents('1.php'));2$token = $tokens[0];3echo $token->getParent()->getLine();4$tokens = token_get_all(file_get_contents('2.php'));5$token = $tokens[0];6echo $token->getParent()->getLine();7$tokens = token_get_all(file_get_contents('3.php'));8$token = $tokens[0];9echo $token->getParent()->getLine();10$tokens = token_get_all(file_get_contents('4.php'));11$token = $tokens[0];12echo $token->getParent()->getLine();13$tokens = token_get_all(file_get_contents('5.php'));14$token = $tokens[0];15echo $token->getParent()->getLine();16$tokens = token_get_all(file_get_contents('6.php'));17$token = $tokens[0];18echo $token->getParent()->getLine();19$tokens = token_get_all(file_get_contents('7.php'));20$token = $tokens[0];21echo $token->getParent()->getLine();22$tokens = token_get_all(file_get_contents('8.php'));23$token = $tokens[0];24echo $token->getParent()->getLine();25$tokens = token_get_all(file_get_contents('9.php'));26$token = $tokens[0];27echo $token->getParent()->getLine();28$tokens = token_get_all(file_get_contents('10.php'));29$token = $tokens[0];30echo $token->getParent()->getLine();31$tokens = token_get_all(file_get_contents('11.php'));32$token = $tokens[0];33echo $token->getParent()->get
getParent
Using AI Code Generation
1$tokens = token_get_all(file_get_contents("1.php"));2foreach ($tokens as $token) {3 if (is_array($token)) {4 $token = new Token($token);5 $parent = $token->getParent();6 if ($parent) {7 echo "Parent: ".$parent->getName()."8";9 }10 }11}
Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Execute automation tests with getParent on a cloud-based Grid of 3000+ real browsers and operating systems for both web and mobile applications.
Test now for FreeGet 100 minutes of automation test minutes FREE!!