mirror of
https://github.com/Telecominfraproject/wlan-testing.git
synced 2025-12-02 19:03:54 +00:00
Perfecto Mobile Device TestCases
This commit is contained in:
75
libs/perfecto/android/BaseClassAndroid.py
Normal file
75
libs/perfecto/android/BaseClassAndroid.py
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
import urllib3
|
||||||
|
import argparse
|
||||||
|
#from perfecto import (PerfectoExecutionContext, PerfectoReportiumClient,
|
||||||
|
# TestContext, TestResultFactory)
|
||||||
|
from appium import webdriver
|
||||||
|
#rom selenium import webdriver
|
||||||
|
|
||||||
|
class TestConf(unittest.TestCase):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
#Suppress InsecureRequestWarning: Unverified HTTPS request is being made
|
||||||
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
|
self.securityToken = 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJqdGkiOiJjYjRjYjQzYi05Y2FiLTQxNzQtOTYxYi04MDEwNTZkNDM2MzgiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjExNTk0NzcxLCJpc3MiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwiYXVkIjoiaHR0cHM6Ly9hdXRoMi5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvdGlwLXBlcmZlY3RvbW9iaWxlLWNvbSIsInN1YiI6IjdiNTMwYWUwLTg4MTgtNDdiOS04M2YzLTdmYTBmYjBkZGI0ZSIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJvZmZsaW5lLXRva2VuLWdlbmVyYXRvciIsIm5vbmNlIjoiZTRmOTY4NjYtZTE3NS00YzM2LWEyODMtZTQwMmI3M2U5NzhlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYWNkNTQ3MTctNzJhZC00MGU3LWI0ZDctZjlkMTAyNDRkNWZlIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.SOL-wlZiQ4BoLLfaeIW8QoxJ6xzrgxBjwSiSzkLBPYw'
|
||||||
|
self.host = 'tip.perfectomobile.com'
|
||||||
|
self.driver = None
|
||||||
|
# self.reporting_client = None
|
||||||
|
|
||||||
|
super(TestConf, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
capabilities = {
|
||||||
|
'platformName': 'Android',
|
||||||
|
'bundleId': 'com.android.settings',
|
||||||
|
'securityToken' : "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJqdGkiOiJjYjRjYjQzYi05Y2FiLTQxNzQtOTYxYi04MDEwNTZkNDM2MzgiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjExNTk0NzcxLCJpc3MiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwiYXVkIjoiaHR0cHM6Ly9hdXRoMi5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvdGlwLXBlcmZlY3RvbW9iaWxlLWNvbSIsInN1YiI6IjdiNTMwYWUwLTg4MTgtNDdiOS04M2YzLTdmYTBmYjBkZGI0ZSIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJvZmZsaW5lLXRva2VuLWdlbmVyYXRvciIsIm5vbmNlIjoiZTRmOTY4NjYtZTE3NS00YzM2LWEyODMtZTQwMmI3M2U5NzhlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYWNkNTQ3MTctNzJhZC00MGU3LWI0ZDctZjlkMTAyNDRkNWZlIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.SOL-wlZiQ4BoLLfaeIW8QoxJ6xzrgxBjwSiSzkLBPYw",
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
self.driver = webdriver.Remote('https://tip.perfectomobile.com/nexperience/perfectomobile/wd/hub', capabilities)
|
||||||
|
# self.create_reporting_client()
|
||||||
|
# self.reporting_client.test_start(self.id(), TestContext('Python', 'unittest'))
|
||||||
|
|
||||||
|
def run(self, result=None):
|
||||||
|
self.currentResult = result # remember result for use in tearDown
|
||||||
|
unittest.TestCase.run(self, result) # call superclass run method
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
print("-------------------------------------------")
|
||||||
|
print(" -- Tear Down --")
|
||||||
|
|
||||||
|
#if self.currentResult.wasSuccessful():
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_success())
|
||||||
|
# else:
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure('failure 4096' * 1000))
|
||||||
|
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure(self.currentResult.errors,
|
||||||
|
# self.currentResult.failures))
|
||||||
|
# Print report's url
|
||||||
|
#print('Report-Url: ' + self.reporting_client.report_url() + '\n')
|
||||||
|
except Exception as e:
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.driver.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To close --")
|
||||||
|
print (e.message)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
self.driver.quit()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To Quit --")
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
# def create_reporting_client(self):
|
||||||
|
# perfecto_execution_context = PerfectoExecutionContext(self.driver, ['execution tag1', 'execution tag2'])
|
||||||
|
# self.reporting_client = PerfectoReportiumClient(perfecto_execution_context)
|
||||||
88
libs/perfecto/android/BaseClassWebAndroid.py
Normal file
88
libs/perfecto/android/BaseClassWebAndroid.py
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
import urllib3
|
||||||
|
import argparse
|
||||||
|
#from perfecto import (PerfectoExecutionContext, PerfectoReportiumClient,
|
||||||
|
# TestContext, TestResultFactory)
|
||||||
|
#from appium import webdriver
|
||||||
|
from selenium import webdriver
|
||||||
|
|
||||||
|
class TestConf(unittest.TestCase):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
#Suppress InsecureRequestWarning: Unverified HTTPS request is being made
|
||||||
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
|
#Perfecto
|
||||||
|
self.securityToken = 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyODhhNDIyNS1jOTE1LTQwZDctOTc2YS04MDhiMWE3YTFmODYifQ.eyJqdGkiOiJkMmMwNzU5YS0yNWIyLTQ4ZmItYmViNC0wNzAxMWI4MDVmODMiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjE0MjI5MTUxLCJpc3MiOiJodHRwczovL2F1dGgucGVyZmVjdG9tb2JpbGUuY29tL2F1dGgvcmVhbG1zL3BzLXBlcmZlY3RvbW9iaWxlLWNvbSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvcHMtcGVyZmVjdG9tb2JpbGUtY29tIiwic3ViIjoiMzkzYjMxYTQtNDJiZS00NmIxLTg5MGUtYmRlNzY3ZWEzYjQ2IiwidHlwIjoiT2ZmbGluZSIsImF6cCI6Im9mZmxpbmUtdG9rZW4tZ2VuZXJhdG9yIiwibm9uY2UiOiJmOTQ4MjI2Yi04YWQwLTQ1YTAtYmMzNC04NzQ5MzZjNDQ0NDgiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzMzVhNGM2My01ODE4LTQ0NmMtOTA2NC1iZWZiY2JkZWQ2N2MiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciIsInJlcG9ydF9hZG1pbiJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgb2ZmbGluZV9hY2Nlc3MifQ.BKnSYDAczir7suvt_5T44pJ5IaZLzsT_JwVAziR4pKg'
|
||||||
|
self.host = 'ps.perfectomobile.com'
|
||||||
|
|
||||||
|
#self.securityToken = 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJqdGkiOiJjYjRjYjQzYi05Y2FiLTQxNzQtOTYxYi04MDEwNTZkNDM2MzgiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjExNTk0NzcxLCJpc3MiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwiYXVkIjoiaHR0cHM6Ly9hdXRoMi5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvdGlwLXBlcmZlY3RvbW9iaWxlLWNvbSIsInN1YiI6IjdiNTMwYWUwLTg4MTgtNDdiOS04M2YzLTdmYTBmYjBkZGI0ZSIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJvZmZsaW5lLXRva2VuLWdlbmVyYXRvciIsIm5vbmNlIjoiZTRmOTY4NjYtZTE3NS00YzM2LWEyODMtZTQwMmI3M2U5NzhlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYWNkNTQ3MTctNzJhZC00MGU3LWI0ZDctZjlkMTAyNDRkNWZlIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.SOL-wlZiQ4BoLLfaeIW8QoxJ6xzrgxBjwSiSzkLBPYw'
|
||||||
|
#self.host = 'tip.perfectomobile.com'
|
||||||
|
|
||||||
|
self.driver = None
|
||||||
|
# self.reporting_client = None
|
||||||
|
|
||||||
|
super(TestConf, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
capabilities = {
|
||||||
|
'platformName': 'Android',
|
||||||
|
'securityToken' : 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyODhhNDIyNS1jOTE1LTQwZDctOTc2YS04MDhiMWE3YTFmODYifQ.eyJqdGkiOiJkMmMwNzU5YS0yNWIyLTQ4ZmItYmViNC0wNzAxMWI4MDVmODMiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjE0MjI5MTUxLCJpc3MiOiJodHRwczovL2F1dGgucGVyZmVjdG9tb2JpbGUuY29tL2F1dGgvcmVhbG1zL3BzLXBlcmZlY3RvbW9iaWxlLWNvbSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvcHMtcGVyZmVjdG9tb2JpbGUtY29tIiwic3ViIjoiMzkzYjMxYTQtNDJiZS00NmIxLTg5MGUtYmRlNzY3ZWEzYjQ2IiwidHlwIjoiT2ZmbGluZSIsImF6cCI6Im9mZmxpbmUtdG9rZW4tZ2VuZXJhdG9yIiwibm9uY2UiOiJmOTQ4MjI2Yi04YWQwLTQ1YTAtYmMzNC04NzQ5MzZjNDQ0NDgiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzMzVhNGM2My01ODE4LTQ0NmMtOTA2NC1iZWZiY2JkZWQ2N2MiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciIsInJlcG9ydF9hZG1pbiJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgb2ZmbGluZV9hY2Nlc3MifQ.BKnSYDAczir7suvt_5T44pJ5IaZLzsT_JwVAziR4pKg',
|
||||||
|
#browserName Chrome/Safari/MobileOS/MobileDefault/PerfectoMobile
|
||||||
|
'browserName': 'MobileOS'
|
||||||
|
#'bundleId': 'com.apple.mobilesafari',
|
||||||
|
#'enableAppiumBehavior': True, # Enable new architecture of Appium
|
||||||
|
# 'autoLaunch': True, # To work with hybrid applications, install the iOS/Android application as instrumented.
|
||||||
|
#'OS': 'Android.*'
|
||||||
|
}
|
||||||
|
|
||||||
|
#self.driver = webdriver.Remote('https://tip.perfectomobile.com/nexperience/perfectomobile/wd/hub', capabilities)
|
||||||
|
|
||||||
|
self.driver = webdriver.Remote('https://ps.perfectomobile.com/nexperience/perfectomobile/wd/hub', capabilities)
|
||||||
|
self.driver.implicitly_wait(30)
|
||||||
|
# self.create_reporting_client()
|
||||||
|
# self.reporting_client.test_start(self.id(), TestContext('Python', 'unittest'))
|
||||||
|
|
||||||
|
def run(self, result=None):
|
||||||
|
self.currentResult = result # remember result for use in tearDown
|
||||||
|
unittest.TestCase.run(self, result) # call superclass run method
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
print("-------------------------------------------")
|
||||||
|
print(" -- Tear Down --")
|
||||||
|
|
||||||
|
#if self.currentResult.wasSuccessful():
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_success())
|
||||||
|
# else:
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure('failure 4096' * 1000))
|
||||||
|
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure(self.currentResult.errors,
|
||||||
|
# self.currentResult.failures))
|
||||||
|
# Print report's url
|
||||||
|
#print('Report-Url: ' + self.reporting_client.report_url() + '\n')
|
||||||
|
except Exception as e:
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.driver.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To close --")
|
||||||
|
print (e.message)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
self.driver.quit()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To Quit --")
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# def create_reporting_client(self):
|
||||||
|
# perfecto_execution_context = PerfectoExecutionContext(self.driver, ['execution tag1', 'execution tag2'])
|
||||||
|
# self.reporting_client = PerfectoReportiumClient(perfecto_execution_context)
|
||||||
109
libs/perfecto/android/VerifyAPToMobileDeviceAndroid.py
Normal file
109
libs/perfecto/android/VerifyAPToMobileDeviceAndroid.py
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
from selenium.webdriver.common.keys import Keys
|
||||||
|
#from perfecto import TestResultFactory
|
||||||
|
from selenium.common.exceptions import NoSuchElementException
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
from urllib3.exceptions import HeaderParsingError
|
||||||
|
from BaseClassWebAndroid import TestConf
|
||||||
|
|
||||||
|
|
||||||
|
class ReportingTests(TestConf):
|
||||||
|
|
||||||
|
def test_navigation(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
print("-----------------AP TO MOBILE DEVICE--------------------------")
|
||||||
|
#REPORTIUM TEST START
|
||||||
|
#self.reporting_client.step_start("BasicConnectionTest")
|
||||||
|
|
||||||
|
#Search
|
||||||
|
try:
|
||||||
|
self.driver.get('https://www.google.com')
|
||||||
|
lblSearch = "//*[@class='gLFyf']"
|
||||||
|
elementFindTxt = self.driver.find_element_by_xpath(lblSearch)
|
||||||
|
elementFindTxt.send_keys("Internet Speed Test")
|
||||||
|
|
||||||
|
try:
|
||||||
|
elelSearch = self.driver.find_element_by_xpath("(//*[@class='sbic sb43'])[1]")
|
||||||
|
elelSearch.click()
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Enter Not Active...")
|
||||||
|
time.sleep(15)
|
||||||
|
|
||||||
|
BtnRunSpeedTest = "//*[@id='knowledge-verticals-internetspeedtest__test_button']"
|
||||||
|
self.driver.find_element_by_xpath(BtnRunSpeedTest).click()
|
||||||
|
|
||||||
|
#Get upload/Download Speed
|
||||||
|
try:
|
||||||
|
time.sleep(60)
|
||||||
|
downloadMbps = self.driver.find_element_by_xpath("//*[@id='knowledge-verticals-internetspeedtest__download']/P[@class='spiqle']")
|
||||||
|
downloadSpeed = downloadMbps.text
|
||||||
|
print("Download: " + downloadSpeed + " Mbps")
|
||||||
|
|
||||||
|
UploadMbps = self.driver.find_element_by_xpath("//*[@id='knowledge-verticals-internetspeedtest__upload']/P[@class='spiqle']")
|
||||||
|
uploadSpeed = UploadMbps.text
|
||||||
|
print("Upload: " + uploadSpeed + " Mbps")
|
||||||
|
|
||||||
|
print("Access Point Verification Completed Successfully")
|
||||||
|
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Access Point Verification NOT Completed, checking Connection....")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
#refresh page //*[@label="reload"]
|
||||||
|
#TestAgain: //*[text()="TEST AGAIN"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# time.sleep(20)
|
||||||
|
|
||||||
|
|
||||||
|
#Close Settings App
|
||||||
|
# self.driver.execute_script('mobile:application:close', params2)
|
||||||
|
|
||||||
|
#REPORTIUM TEST END
|
||||||
|
#self.reporting_client.step_end()
|
||||||
|
|
||||||
|
except NoSuchElementException as ex:
|
||||||
|
self.currentResult = False
|
||||||
|
#self.reporting_client.test_stop(TestResultFactory.create_failure("NoSuchElementException", ex))
|
||||||
|
print (ex.message)
|
||||||
|
self.currentResult = True
|
||||||
|
#self.reporting_client.test_stop(Tes
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# parser = argparse.ArgumentParser(description="Perfecto Arguments")
|
||||||
|
|
||||||
|
#parser.add_argument(
|
||||||
|
# "-c",
|
||||||
|
# "--cloud_name",
|
||||||
|
# metavar="cloud_name",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
#)
|
||||||
|
# parser.add_argument(
|
||||||
|
# "-s",
|
||||||
|
# "--security_token",
|
||||||
|
# metavar="security_token",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
# )
|
||||||
|
|
||||||
|
#args = vars(parser.parse_args())
|
||||||
|
|
||||||
|
#if not args["cloud_name"]:
|
||||||
|
# parser.print_help()
|
||||||
|
# parser.error(
|
||||||
|
# "cloud_name parameter is empty. Pass the argument -c followed by cloud_name"
|
||||||
|
# )
|
||||||
|
# exit
|
||||||
|
|
||||||
|
#print(str(args["cloud_name"]))
|
||||||
|
unittest.main()
|
||||||
|
|
||||||
|
|
||||||
88
libs/perfecto/android/VerifyPassPointConnection.py
Normal file
88
libs/perfecto/android/VerifyPassPointConnection.py
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
import time
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
#from perfecto import TestResultFactory
|
||||||
|
from selenium.common.exceptions import NoSuchElementException
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
import argparse
|
||||||
|
from BaseClassAndroid import TestConf
|
||||||
|
|
||||||
|
|
||||||
|
class ReportingTests(TestConf):
|
||||||
|
|
||||||
|
def test_navigation(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
# assert 'Perfecto' in self.driver.title
|
||||||
|
print("-------------------------------------------")
|
||||||
|
#REPORTIUM TEST START
|
||||||
|
#self.reporting_client.step_start("BasicConnectionTest")
|
||||||
|
#DefaultGateWayAccessPoint = self.driver.find_element_by_xpath("//*[@label='Default Gateway IP']/parent::*/XCUIElementTypeButton").text
|
||||||
|
# print("Device-DefaultGateWay-AP: " + "'"+ DefaultGateWayAccessPoint + "'")
|
||||||
|
#self.assertNotEqual(DefaultGateWayAccessPoint, "N/A", "Check Wifi Access Point")
|
||||||
|
# print("Verify Internet Connection..")
|
||||||
|
# networkAccessPoint = self.driver.find_element_by_xpath("//*[@label='Network Connected']/parent::*/XCUIElementTypeButton").text
|
||||||
|
# print("Network-AccessPoint-Connected: " + "'"+ networkAccessPoint + "'")
|
||||||
|
|
||||||
|
#Open Setting Application
|
||||||
|
# print("Opening Settings App..")
|
||||||
|
# params = {'identifier': 'com.android.settings'}
|
||||||
|
#self.driver.execute_script('mobile:application:open', params)
|
||||||
|
# self.driver.execute_script('mobile:application:close', params)
|
||||||
|
# self.driver.execute_script('mobile:application:open', params)
|
||||||
|
|
||||||
|
# params = {'property': 'All'}
|
||||||
|
# deviceProperty = self.driver.execute_script('mobile:handset:info', params)
|
||||||
|
# print("ModelName: " + deviceProperty)
|
||||||
|
|
||||||
|
params = {'property': 'deviceId'}
|
||||||
|
deviceID = self.driver.execute_script('mobile:handset:info', params)
|
||||||
|
params = {'property': 'model'}
|
||||||
|
deviceModel = self.driver.execute_script('mobile:handset:info', params)
|
||||||
|
print("ModelName: " + deviceModel + " DeviceId: " + deviceID)
|
||||||
|
|
||||||
|
#modelName = self.driver.desired_capabilities['model']
|
||||||
|
#deviceID = self.driver.desired_capabilities['deviceId']
|
||||||
|
#
|
||||||
|
# print("DeviceID: " + deviceID)
|
||||||
|
|
||||||
|
#Close Settings App
|
||||||
|
# print("Close Settings App")
|
||||||
|
#self.driver.execute_script('mobile:application:close', params)
|
||||||
|
|
||||||
|
except NoSuchElementException as ex:
|
||||||
|
self.currentResult = False
|
||||||
|
#self.reporting_client.test_stop(TestResultFactory.create_failure("NoSuchElementException", ex))
|
||||||
|
print (ex.message)
|
||||||
|
self.currentResult = True
|
||||||
|
#self.reporting_client.test_stop(Tes
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# parser = argparse.ArgumentParser(description="Perfecto Arguments")
|
||||||
|
|
||||||
|
#parser.add_argument(
|
||||||
|
# "-c",
|
||||||
|
# "--cloud_name",
|
||||||
|
# metavar="cloud_name",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
#)
|
||||||
|
# parser.add_argument(
|
||||||
|
# "-s",
|
||||||
|
# "--security_token",
|
||||||
|
# metavar="security_token",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
# )
|
||||||
|
|
||||||
|
#args = vars(parser.parse_args())
|
||||||
|
|
||||||
|
#if not args["cloud_name"]:
|
||||||
|
# parser.print_help()
|
||||||
|
# parser.error(
|
||||||
|
# "cloud_name parameter is empty. Pass the argument -c followed by cloud_name"
|
||||||
|
# )
|
||||||
|
# exit
|
||||||
|
|
||||||
|
#print(str(args["cloud_name"]))
|
||||||
|
|
||||||
|
unittest.main()
|
||||||
88
libs/perfecto/iOS/BaseClassWebiOS.py
Normal file
88
libs/perfecto/iOS/BaseClassWebiOS.py
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
import urllib3
|
||||||
|
import argparse
|
||||||
|
#from perfecto import (PerfectoExecutionContext, PerfectoReportiumClient,
|
||||||
|
# TestContext, TestResultFactory)
|
||||||
|
#from appium import webdriver
|
||||||
|
from selenium import webdriver
|
||||||
|
|
||||||
|
class TestConf(unittest.TestCase):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
#Suppress InsecureRequestWarning: Unverified HTTPS request is being made
|
||||||
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
|
#Perfecto
|
||||||
|
self.securityToken = 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyODhhNDIyNS1jOTE1LTQwZDctOTc2YS04MDhiMWE3YTFmODYifQ.eyJqdGkiOiJkMmMwNzU5YS0yNWIyLTQ4ZmItYmViNC0wNzAxMWI4MDVmODMiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjE0MjI5MTUxLCJpc3MiOiJodHRwczovL2F1dGgucGVyZmVjdG9tb2JpbGUuY29tL2F1dGgvcmVhbG1zL3BzLXBlcmZlY3RvbW9iaWxlLWNvbSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvcHMtcGVyZmVjdG9tb2JpbGUtY29tIiwic3ViIjoiMzkzYjMxYTQtNDJiZS00NmIxLTg5MGUtYmRlNzY3ZWEzYjQ2IiwidHlwIjoiT2ZmbGluZSIsImF6cCI6Im9mZmxpbmUtdG9rZW4tZ2VuZXJhdG9yIiwibm9uY2UiOiJmOTQ4MjI2Yi04YWQwLTQ1YTAtYmMzNC04NzQ5MzZjNDQ0NDgiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzMzVhNGM2My01ODE4LTQ0NmMtOTA2NC1iZWZiY2JkZWQ2N2MiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciIsInJlcG9ydF9hZG1pbiJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgb2ZmbGluZV9hY2Nlc3MifQ.BKnSYDAczir7suvt_5T44pJ5IaZLzsT_JwVAziR4pKg'
|
||||||
|
self.host = 'ps.perfectomobile.com'
|
||||||
|
|
||||||
|
#self.securityToken = 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJqdGkiOiJjYjRjYjQzYi05Y2FiLTQxNzQtOTYxYi04MDEwNTZkNDM2MzgiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjExNTk0NzcxLCJpc3MiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwiYXVkIjoiaHR0cHM6Ly9hdXRoMi5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvdGlwLXBlcmZlY3RvbW9iaWxlLWNvbSIsInN1YiI6IjdiNTMwYWUwLTg4MTgtNDdiOS04M2YzLTdmYTBmYjBkZGI0ZSIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJvZmZsaW5lLXRva2VuLWdlbmVyYXRvciIsIm5vbmNlIjoiZTRmOTY4NjYtZTE3NS00YzM2LWEyODMtZTQwMmI3M2U5NzhlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYWNkNTQ3MTctNzJhZC00MGU3LWI0ZDctZjlkMTAyNDRkNWZlIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.SOL-wlZiQ4BoLLfaeIW8QoxJ6xzrgxBjwSiSzkLBPYw'
|
||||||
|
#self.host = 'tip.perfectomobile.com'
|
||||||
|
|
||||||
|
self.driver = None
|
||||||
|
# self.reporting_client = None
|
||||||
|
|
||||||
|
super(TestConf, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
capabilities = {
|
||||||
|
'platformName': 'iOS',
|
||||||
|
#'manufacturer': 'Apple',
|
||||||
|
'browserName': 'safari',
|
||||||
|
'securityToken' : 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIyODhhNDIyNS1jOTE1LTQwZDctOTc2YS04MDhiMWE3YTFmODYifQ.eyJqdGkiOiJkMmMwNzU5YS0yNWIyLTQ4ZmItYmViNC0wNzAxMWI4MDVmODMiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjE0MjI5MTUxLCJpc3MiOiJodHRwczovL2F1dGgucGVyZmVjdG9tb2JpbGUuY29tL2F1dGgvcmVhbG1zL3BzLXBlcmZlY3RvbW9iaWxlLWNvbSIsImF1ZCI6Imh0dHBzOi8vYXV0aC5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvcHMtcGVyZmVjdG9tb2JpbGUtY29tIiwic3ViIjoiMzkzYjMxYTQtNDJiZS00NmIxLTg5MGUtYmRlNzY3ZWEzYjQ2IiwidHlwIjoiT2ZmbGluZSIsImF6cCI6Im9mZmxpbmUtdG9rZW4tZ2VuZXJhdG9yIiwibm9uY2UiOiJmOTQ4MjI2Yi04YWQwLTQ1YTAtYmMzNC04NzQ5MzZjNDQ0NDgiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIzMzVhNGM2My01ODE4LTQ0NmMtOTA2NC1iZWZiY2JkZWQ2N2MiLCJyZWFsbV9hY2Nlc3MiOnsicm9sZXMiOlsib2ZmbGluZV9hY2Nlc3MiXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciIsInJlcG9ydF9hZG1pbiJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgb2ZmbGluZV9hY2Nlc3MifQ.BKnSYDAczir7suvt_5T44pJ5IaZLzsT_JwVAziR4pKg',
|
||||||
|
#'bundleId': 'com.apple.mobilesafari',
|
||||||
|
#'enableAppiumBehavior': True, # Enable new architecture of Appium
|
||||||
|
# 'autoLaunch': True, # To work with hybrid applications, install the iOS/Android application as instrumented.
|
||||||
|
'model': 'iPhone.*'
|
||||||
|
}
|
||||||
|
|
||||||
|
#self.driver = webdriver.Remote('https://tip.perfectomobile.com/nexperience/perfectomobile/wd/hub', capabilities)
|
||||||
|
|
||||||
|
self.driver = webdriver.Remote('https://ps.perfectomobile.com/nexperience/perfectomobile/wd/hub', capabilities)
|
||||||
|
self.driver.implicitly_wait(20)
|
||||||
|
# self.create_reporting_client()
|
||||||
|
# self.reporting_client.test_start(self.id(), TestContext('Python', 'unittest'))
|
||||||
|
|
||||||
|
def run(self, result=None):
|
||||||
|
self.currentResult = result # remember result for use in tearDown
|
||||||
|
unittest.TestCase.run(self, result) # call superclass run method
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
print("-------------------------------------------")
|
||||||
|
print(" -- Tear Down --")
|
||||||
|
|
||||||
|
#if self.currentResult.wasSuccessful():
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_success())
|
||||||
|
# else:
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure('failure 4096' * 1000))
|
||||||
|
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure(self.currentResult.errors,
|
||||||
|
# self.currentResult.failures))
|
||||||
|
# Print report's url
|
||||||
|
#print('Report-Url: ' + self.reporting_client.report_url() + '\n')
|
||||||
|
except Exception as e:
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.driver.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To close --")
|
||||||
|
print (e.message)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
self.driver.quit()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To Quit --")
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# def create_reporting_client(self):
|
||||||
|
# perfecto_execution_context = PerfectoExecutionContext(self.driver, ['execution tag1', 'execution tag2'])
|
||||||
|
# self.reporting_client = PerfectoReportiumClient(perfecto_execution_context)
|
||||||
78
libs/perfecto/iOS/BaseClassiOS.py
Normal file
78
libs/perfecto/iOS/BaseClassiOS.py
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
import urllib3
|
||||||
|
import argparse
|
||||||
|
#from perfecto import (PerfectoExecutionContext, PerfectoReportiumClient,
|
||||||
|
# TestContext, TestResultFactory)
|
||||||
|
from appium import webdriver
|
||||||
|
from selenium import webdriver
|
||||||
|
|
||||||
|
class TestConf(unittest.TestCase):
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
#Suppress InsecureRequestWarning: Unverified HTTPS request is being made
|
||||||
|
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
|
||||||
|
|
||||||
|
self.securityToken = 'eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJqdGkiOiJjYjRjYjQzYi05Y2FiLTQxNzQtOTYxYi04MDEwNTZkNDM2MzgiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjExNTk0NzcxLCJpc3MiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwiYXVkIjoiaHR0cHM6Ly9hdXRoMi5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvdGlwLXBlcmZlY3RvbW9iaWxlLWNvbSIsInN1YiI6IjdiNTMwYWUwLTg4MTgtNDdiOS04M2YzLTdmYTBmYjBkZGI0ZSIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJvZmZsaW5lLXRva2VuLWdlbmVyYXRvciIsIm5vbmNlIjoiZTRmOTY4NjYtZTE3NS00YzM2LWEyODMtZTQwMmI3M2U5NzhlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYWNkNTQ3MTctNzJhZC00MGU3LWI0ZDctZjlkMTAyNDRkNWZlIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.SOL-wlZiQ4BoLLfaeIW8QoxJ6xzrgxBjwSiSzkLBPYw'
|
||||||
|
self.host = 'tip.perfectomobile.com'
|
||||||
|
self.driver = None
|
||||||
|
# self.reporting_client = None
|
||||||
|
|
||||||
|
super(TestConf, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
capabilities = {
|
||||||
|
'platformName': 'iOS',
|
||||||
|
'manufacturer': 'Apple',
|
||||||
|
'model': 'iPhone.*',
|
||||||
|
'bundleId': 'net.techet.netanalyzerlite',
|
||||||
|
'securityToken' : "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI3NzkzZGM0Ni1jZmU4LTQ4ODMtYjhiOS02ZWFlZGU2OTc2MDkifQ.eyJqdGkiOiJjYjRjYjQzYi05Y2FiLTQxNzQtOTYxYi04MDEwNTZkNDM2MzgiLCJleHAiOjAsIm5iZiI6MCwiaWF0IjoxNjExNTk0NzcxLCJpc3MiOiJodHRwczovL2F1dGgyLnBlcmZlY3RvbW9iaWxlLmNvbS9hdXRoL3JlYWxtcy90aXAtcGVyZmVjdG9tb2JpbGUtY29tIiwiYXVkIjoiaHR0cHM6Ly9hdXRoMi5wZXJmZWN0b21vYmlsZS5jb20vYXV0aC9yZWFsbXMvdGlwLXBlcmZlY3RvbW9iaWxlLWNvbSIsInN1YiI6IjdiNTMwYWUwLTg4MTgtNDdiOS04M2YzLTdmYTBmYjBkZGI0ZSIsInR5cCI6Ik9mZmxpbmUiLCJhenAiOiJvZmZsaW5lLXRva2VuLWdlbmVyYXRvciIsIm5vbmNlIjoiZTRmOTY4NjYtZTE3NS00YzM2LWEyODMtZTQwMmI3M2U5NzhlIiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiYWNkNTQ3MTctNzJhZC00MGU3LWI0ZDctZjlkMTAyNDRkNWZlIiwicmVhbG1fYWNjZXNzIjp7InJvbGVzIjpbIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJyZXBvcnRpdW0iOnsicm9sZXMiOlsiYWRtaW5pc3RyYXRvciJdfSwiYWNjb3VudCI6eyJyb2xlcyI6WyJtYW5hZ2UtYWNjb3VudCIsIm1hbmFnZS1hY2NvdW50LWxpbmtzIiwidmlldy1wcm9maWxlIl19fSwic2NvcGUiOiJvcGVuaWQgcHJvZmlsZSBvZmZsaW5lX2FjY2VzcyBlbWFpbCJ9.SOL-wlZiQ4BoLLfaeIW8QoxJ6xzrgxBjwSiSzkLBPYw",
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
self.driver = webdriver.Remote('https://tip.perfectomobile.com/nexperience/perfectomobile/wd/hub', capabilities)
|
||||||
|
# self.create_reporting_client()
|
||||||
|
# self.reporting_client.test_start(self.id(), TestContext('Python', 'unittest'))
|
||||||
|
|
||||||
|
def run(self, result=None):
|
||||||
|
self.currentResult = result # remember result for use in tearDown
|
||||||
|
unittest.TestCase.run(self, result) # call superclass run method
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
print("-------------------------------------------")
|
||||||
|
print(" -- Tear Down --")
|
||||||
|
|
||||||
|
#if self.currentResult.wasSuccessful():
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_success())
|
||||||
|
# else:
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure('failure 4096' * 1000))
|
||||||
|
|
||||||
|
# self.reporting_client.test_stop(TestResultFactory.create_failure(self.currentResult.errors,
|
||||||
|
# self.currentResult.failures))
|
||||||
|
# Print report's url
|
||||||
|
#print('Report-Url: ' + self.reporting_client.report_url() + '\n')
|
||||||
|
except Exception as e:
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.driver.close()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To close --")
|
||||||
|
print (e.message)
|
||||||
|
finally:
|
||||||
|
try:
|
||||||
|
self.driver.quit()
|
||||||
|
except Exception as e:
|
||||||
|
print(" -- Exception Not Able To Quit --")
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
# def create_reporting_client(self):
|
||||||
|
# perfecto_execution_context = PerfectoExecutionContext(self.driver, ['execution tag1', 'execution tag2'])
|
||||||
|
# self.reporting_client = PerfectoReportiumClient(perfecto_execution_context)
|
||||||
107
libs/perfecto/iOS/VerifyAPToMobileDevice.py
Normal file
107
libs/perfecto/iOS/VerifyAPToMobileDevice.py
Normal file
@@ -0,0 +1,107 @@
|
|||||||
|
import time
|
||||||
|
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
from selenium.webdriver.common.keys import Keys
|
||||||
|
#from perfecto import TestResultFactory
|
||||||
|
from selenium.common.exceptions import NoSuchElementException
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
import argparse
|
||||||
|
|
||||||
|
from urllib3.exceptions import HeaderParsingError
|
||||||
|
from BaseClassWeb import TestConf
|
||||||
|
|
||||||
|
|
||||||
|
class ReportingTests(TestConf):
|
||||||
|
|
||||||
|
def test_navigation(self):
|
||||||
|
try:
|
||||||
|
print("-----------------AP TO MOBILE DEVICE--------------------------")
|
||||||
|
#REPORTIUM TEST START
|
||||||
|
#self.reporting_client.step_start("BasicConnectionTest")
|
||||||
|
|
||||||
|
#Search
|
||||||
|
try:
|
||||||
|
self.driver.get('https://www.google.com')
|
||||||
|
lblSearch = "//*[@class='gLFyf']"
|
||||||
|
elementFindTxt = self.driver.find_element_by_xpath(lblSearch)
|
||||||
|
elementFindTxt.send_keys("Internet Speed Test")
|
||||||
|
|
||||||
|
try:
|
||||||
|
elelSearch = self.driver.find_element_by_xpath("(//*[@class='sbic sb43'])[1]")
|
||||||
|
elelSearch.click()
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Enter Not Active...")
|
||||||
|
|
||||||
|
BtnRunSpeedTest = "//*[text()='RUN SPEED TEST']"
|
||||||
|
self.driver.find_element_by_xpath(BtnRunSpeedTest).click()
|
||||||
|
|
||||||
|
#Get upload/Download Speed
|
||||||
|
try:
|
||||||
|
time.sleep(60)
|
||||||
|
downloadMbps = self.driver.find_element_by_xpath("//*[@id='knowledge-verticals-internetspeedtest__download']/P[@class='spiqle']")
|
||||||
|
downloadSpeed = downloadMbps.text
|
||||||
|
print("Download: " + downloadSpeed + " Mbps")
|
||||||
|
|
||||||
|
UploadMbps = self.driver.find_element_by_xpath("//*[@id='knowledge-verticals-internetspeedtest__upload']/P[@class='spiqle']")
|
||||||
|
uploadSpeed = UploadMbps.text
|
||||||
|
print("Upload: " + uploadSpeed + " Mbps")
|
||||||
|
|
||||||
|
print("Access Point Verification Completed Successfully")
|
||||||
|
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Access Point Verification NOT Completed, checking Connection....")
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print (e.message)
|
||||||
|
|
||||||
|
#refresh page //*[@label="reload"]
|
||||||
|
#TestAgain: //*[text()="TEST AGAIN"]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# time.sleep(20)
|
||||||
|
|
||||||
|
|
||||||
|
#Close Settings App
|
||||||
|
# self.driver.execute_script('mobile:application:close', params2)
|
||||||
|
|
||||||
|
#REPORTIUM TEST END
|
||||||
|
#self.reporting_client.step_end()
|
||||||
|
|
||||||
|
except NoSuchElementException as ex:
|
||||||
|
self.currentResult = False
|
||||||
|
#self.reporting_client.test_stop(TestResultFactory.create_failure("NoSuchElementException", ex))
|
||||||
|
print (ex.message)
|
||||||
|
self.currentResult = True
|
||||||
|
#self.reporting_client.test_stop(Tes
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# parser = argparse.ArgumentParser(description="Perfecto Arguments")
|
||||||
|
|
||||||
|
#parser.add_argument(
|
||||||
|
# "-c",
|
||||||
|
# "--cloud_name",
|
||||||
|
# metavar="cloud_name",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
#)
|
||||||
|
# parser.add_argument(
|
||||||
|
# "-s",
|
||||||
|
# "--security_token",
|
||||||
|
# metavar="security_token",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
# )
|
||||||
|
|
||||||
|
#args = vars(parser.parse_args())
|
||||||
|
|
||||||
|
#if not args["cloud_name"]:
|
||||||
|
# parser.print_help()
|
||||||
|
# parser.error(
|
||||||
|
# "cloud_name parameter is empty. Pass the argument -c followed by cloud_name"
|
||||||
|
# )
|
||||||
|
# exit
|
||||||
|
|
||||||
|
#print(str(args["cloud_name"]))
|
||||||
|
unittest.main()
|
||||||
|
|
||||||
|
|
||||||
146
libs/perfecto/iOS/VerifyAccessPointConnectionTest.py
Normal file
146
libs/perfecto/iOS/VerifyAccessPointConnectionTest.py
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
import time
|
||||||
|
import unittest
|
||||||
|
|
||||||
|
#from perfecto import TestResultFactory
|
||||||
|
from selenium.common.exceptions import NoSuchElementException
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
import argparse
|
||||||
|
from BaseClassiOS import TestConf
|
||||||
|
|
||||||
|
|
||||||
|
class ReportingTests(TestConf):
|
||||||
|
|
||||||
|
def test_navigation(self):
|
||||||
|
try:
|
||||||
|
# assert 'Perfecto' in self.driver.title
|
||||||
|
print("-------------------------------------------")
|
||||||
|
#REPORTIUM TEST START
|
||||||
|
#self.reporting_client.step_start("BasicConnectionTest")
|
||||||
|
DefaultGateWayAccessPoint = self.driver.find_element_by_xpath("//*[@label='Default Gateway IP']/parent::*/XCUIElementTypeButton").text
|
||||||
|
print("Device-DefaultGateWay-AP: " + "'"+ DefaultGateWayAccessPoint + "'")
|
||||||
|
self.assertNotEqual(DefaultGateWayAccessPoint, "N/A", "Check Wifi Access Point")
|
||||||
|
|
||||||
|
networkAccessPoint = self.driver.find_element_by_xpath("//*[@label='Network Connected']/parent::*/XCUIElementTypeButton").text
|
||||||
|
print("Network-AccessPoint-Connected: " + "'"+ networkAccessPoint + "'")
|
||||||
|
|
||||||
|
#Open Setting Application
|
||||||
|
print("Opening Settings App..")
|
||||||
|
params = {'identifier': 'com.apple.Preferences'}
|
||||||
|
self.driver.execute_script('mobile:application:open', params)
|
||||||
|
self.driver.execute_script('mobile:application:close', params)
|
||||||
|
self.driver.execute_script('mobile:application:open', params)
|
||||||
|
|
||||||
|
#Verify Wifi Connected Network
|
||||||
|
#try:
|
||||||
|
# settingsBTN = self.driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Settings']")
|
||||||
|
# settingsBTN.click()
|
||||||
|
#except NoSuchElementException:
|
||||||
|
#print("Wifi Main Menu")
|
||||||
|
|
||||||
|
print("Verify Wifi Connection Name..")
|
||||||
|
element = self.driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]")
|
||||||
|
Wifi_AP_Name = element.text
|
||||||
|
print("Wifi_AP_ConnName: " + "'"+ Wifi_AP_Name + "'")
|
||||||
|
|
||||||
|
#Verify if Ap is connected with Wifi
|
||||||
|
print("Click Wifi Connection..")
|
||||||
|
element.click()
|
||||||
|
|
||||||
|
#Verifies if AP is connected to Wifi status
|
||||||
|
print("Verify Wifi Connection Status..")
|
||||||
|
WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ Wifi_AP_Name + "']"
|
||||||
|
elementWifName = self.driver.find_element_by_xpath(WifiXpath)
|
||||||
|
|
||||||
|
#Check AP Internet Error Msg
|
||||||
|
print("Checking Internet Connection Error..")
|
||||||
|
self.driver.implicitly_wait(5)
|
||||||
|
try:
|
||||||
|
WifiInternetErrMsg = self.driver.find_element_by_xpath("//*[@label='No Internet Connection']").text
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Connected-Wifi-AP..Connection Successfull")
|
||||||
|
self.driver.implicitly_wait(30)
|
||||||
|
|
||||||
|
#Close Settings App
|
||||||
|
print("Close Settings App")
|
||||||
|
self.driver.execute_script('mobile:application:close', params)
|
||||||
|
|
||||||
|
#Open Ping App
|
||||||
|
print("Open Ping Application & Ping Host..")
|
||||||
|
params2 = {'identifier': 'com.deftapps.ping'}
|
||||||
|
self.driver.execute_script('mobile:application:open', params2)
|
||||||
|
# The reason to close is to clear any cache from any previous failures
|
||||||
|
self.driver.execute_script('mobile:application:close', params2)
|
||||||
|
self.driver.execute_script('mobile:application:open', params2)
|
||||||
|
|
||||||
|
pingHost = "//*[@value='<Hostname or IP address>']"
|
||||||
|
element2 = self.driver.find_element_by_xpath(pingHost)
|
||||||
|
element2.clear()
|
||||||
|
element2.send_keys(DefaultGateWayAccessPoint)
|
||||||
|
|
||||||
|
#Ping Enable
|
||||||
|
print("Pingin Host..")
|
||||||
|
element3 = self.driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Ping']")
|
||||||
|
element3.click()
|
||||||
|
|
||||||
|
time.sleep(10)
|
||||||
|
print("Stop Ping Host..")
|
||||||
|
element4 = self.driver.find_element_by_xpath("//*[@label='Stop']")
|
||||||
|
element4.click()
|
||||||
|
|
||||||
|
# /* Check Packet Loss */
|
||||||
|
print("Verifying Packet Loss..")
|
||||||
|
try:
|
||||||
|
element5 = self.driver.find_element_by_xpath("//XCUIElementTypeStaticText[@label='0']")
|
||||||
|
self.assertEqual(element5.text, "0", "Packet Loss Exist, Please Check Device")
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("No Packet Loss Detected 1st Attempt")
|
||||||
|
|
||||||
|
# Also Check #Sendto: No route to host
|
||||||
|
print("Verifying No route to host Error Msg....")
|
||||||
|
try:
|
||||||
|
element7 = self.driver.find_element_by_xpath("(//XCUIElementTypeStaticText[@label='Sendto: No route to host'][2]")
|
||||||
|
self.assertNotEqual(element7.text, "Sendto: No route to host", "Packet Loss Exist, Please Check Device AP: " + Wifi_AP_Name)
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("No Packet Loss Detected on AP: " + Wifi_AP_Name)
|
||||||
|
|
||||||
|
#Close Settings App
|
||||||
|
self.driver.execute_script('mobile:application:close', params2)
|
||||||
|
|
||||||
|
#REPORTIUM TEST END
|
||||||
|
#self.reporting_client.step_end()
|
||||||
|
|
||||||
|
except NoSuchElementException as ex:
|
||||||
|
self.currentResult = False
|
||||||
|
#self.reporting_client.test_stop(TestResultFactory.create_failure("NoSuchElementException", ex))
|
||||||
|
print (ex.message)
|
||||||
|
self.currentResult = True
|
||||||
|
#self.reporting_client.test_stop(Tes
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# parser = argparse.ArgumentParser(description="Perfecto Arguments")
|
||||||
|
|
||||||
|
#parser.add_argument(
|
||||||
|
# "-c",
|
||||||
|
# "--cloud_name",
|
||||||
|
# metavar="cloud_name",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
#)
|
||||||
|
# parser.add_argument(
|
||||||
|
# "-s",
|
||||||
|
# "--security_token",
|
||||||
|
# metavar="security_token",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
# )
|
||||||
|
|
||||||
|
#args = vars(parser.parse_args())
|
||||||
|
|
||||||
|
#if not args["cloud_name"]:
|
||||||
|
# parser.print_help()
|
||||||
|
# parser.error(
|
||||||
|
# "cloud_name parameter is empty. Pass the argument -c followed by cloud_name"
|
||||||
|
# )
|
||||||
|
# exit
|
||||||
|
|
||||||
|
#print(str(args["cloud_name"]))
|
||||||
|
|
||||||
|
unittest.main()
|
||||||
143
libs/perfecto/iOS/VerifyPassPointConnection.py
Normal file
143
libs/perfecto/iOS/VerifyPassPointConnection.py
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
import time
|
||||||
|
import unittest
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
#from perfecto import TestResultFactory
|
||||||
|
from selenium.common.exceptions import NoSuchElementException
|
||||||
|
from selenium.webdriver.common.by import By
|
||||||
|
import argparse
|
||||||
|
from BaseClassiOS import TestConf
|
||||||
|
|
||||||
|
|
||||||
|
class ReportingTests(TestConf):
|
||||||
|
|
||||||
|
def test_navigation(self):
|
||||||
|
warnings.simplefilter("ignore", ResourceWarning)
|
||||||
|
try:
|
||||||
|
# assert 'Perfecto' in self.driver.title
|
||||||
|
print("-------------------------------------------")
|
||||||
|
#REPORTIUM TEST START
|
||||||
|
#self.reporting_client.step_start("BasicConnectionTest")
|
||||||
|
#DefaultGateWayAccessPoint = self.driver.find_element_by_xpath("//*[@label='Default Gateway IP']/parent::*/XCUIElementTypeButton").text
|
||||||
|
# print("Device-DefaultGateWay-AP: " + "'"+ DefaultGateWayAccessPoint + "'")
|
||||||
|
#self.assertNotEqual(DefaultGateWayAccessPoint, "N/A", "Check Wifi Access Point")
|
||||||
|
print("Verify Internet Connection..")
|
||||||
|
networkAccessPoint = self.driver.find_element_by_xpath("//*[@label='Network Connected']/parent::*/XCUIElementTypeButton").text
|
||||||
|
print("Network-AccessPoint-Connected: " + "'"+ networkAccessPoint + "'")
|
||||||
|
|
||||||
|
#Open Setting Application
|
||||||
|
print("Opening Settings App..")
|
||||||
|
params = {'identifier': 'com.apple.Preferences'}
|
||||||
|
self.driver.execute_script('mobile:application:open', params)
|
||||||
|
self.driver.execute_script('mobile:application:close', params)
|
||||||
|
self.driver.execute_script('mobile:application:open', params)
|
||||||
|
|
||||||
|
#Verify Wifi Connected Network
|
||||||
|
try:
|
||||||
|
settingsBTN = self.driver.find_element_by_xpath("//XCUIElementTypeButton[@label='Settings']")
|
||||||
|
settingsBTN.click()
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Wifi Main Menu")
|
||||||
|
|
||||||
|
print("Verify Wifi Connection Name..")
|
||||||
|
element = self.driver.find_element_by_xpath("//XCUIElementTypeCell[@name='Wi-Fi']/XCUIElementTypeStaticText[2]")
|
||||||
|
Wifi_AP_Name = element.text
|
||||||
|
print("Wifi_AP_ConnName: " + "'"+ Wifi_AP_Name + "'")
|
||||||
|
|
||||||
|
#Verify if Ap is connected with Wifi
|
||||||
|
print("Click Wifi Connection..")
|
||||||
|
element.click()
|
||||||
|
|
||||||
|
#Verifies if AP is connected to Wifi status
|
||||||
|
print("Verify Wifi Connection Status..")
|
||||||
|
WifiXpath = "//*[@label='selected']/parent::*/parent::*/XCUIElementTypeStaticText[@label='"+ Wifi_AP_Name + "']"
|
||||||
|
elementWifName = self.driver.find_element_by_xpath(WifiXpath)
|
||||||
|
|
||||||
|
#Check AP Internet Error Msg
|
||||||
|
print("Checking Internet Connection Error..")
|
||||||
|
# self.driver.implicitly_wait(5)
|
||||||
|
try:
|
||||||
|
WifiInternetErrMsg = self.driver.find_element_by_xpath("//*[@label='No Internet Connection']").text
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Connected-Wifi-AP..Connection Successfull")
|
||||||
|
|
||||||
|
#Close/Open App resets the settings app back to home page
|
||||||
|
self.driver.execute_script('mobile:application:close', params)
|
||||||
|
self.driver.execute_script('mobile:application:open', params)
|
||||||
|
|
||||||
|
#Toggle Airplane Mode
|
||||||
|
print("Toggle Airplane Mode..")
|
||||||
|
try:
|
||||||
|
AirplaneMode = self.driver.find_element_by_xpath("//XCUIElementTypeSwitch[@label='Airplane Mode']")
|
||||||
|
#Toggle Airplane Mode
|
||||||
|
AirplaneMode.click()
|
||||||
|
|
||||||
|
#Verify Cellular Mode Text
|
||||||
|
try:
|
||||||
|
CellularMsgEle = self.driver.find_element_by_xpath("//*[@name='Airplane Mode' and @value='Airplane Mode']")
|
||||||
|
self.assertEqual(CellularMsgEle.text, "Airplane Mode", "Airplane Mode Not Triggerd")
|
||||||
|
print("Verify Cellular Mode Text: Airplane Mode Success")
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Cellular Mode Not in Airplane Mode: ERROR")
|
||||||
|
|
||||||
|
#Set Airplane Mode Back
|
||||||
|
AirplaneMode.click()
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("Airplane Wifi Button not loaded...")
|
||||||
|
|
||||||
|
#Verify No Sim Card Installed Msg Popup
|
||||||
|
print("Verify No Sim Card Installed Msg Popup..")
|
||||||
|
try:
|
||||||
|
NoSimCardErrorMsg = self.driver.find_element_by_xpath("//*[@value='No SIM Card Installed']")
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("No Sim Card AlertMsg")
|
||||||
|
|
||||||
|
#Click ok on No Sim Card Msg Popup
|
||||||
|
print("Click ok on No Sim Card Msg Popup..")
|
||||||
|
try:
|
||||||
|
NoSimCardErrorMsgOK = self.driver.find_element_by_xpath("//*[@label='OK']")
|
||||||
|
NoSimCardErrorMsgOK.click()
|
||||||
|
except NoSuchElementException:
|
||||||
|
print("No Sim Card AlertMsg")
|
||||||
|
|
||||||
|
#AirplaneMode.click()
|
||||||
|
|
||||||
|
#Close Settings App
|
||||||
|
print("Close Settings App")
|
||||||
|
self.driver.execute_script('mobile:application:close', params)
|
||||||
|
|
||||||
|
except NoSuchElementException as ex:
|
||||||
|
self.currentResult = False
|
||||||
|
#self.reporting_client.test_stop(TestResultFactory.create_failure("NoSuchElementException", ex))
|
||||||
|
print (ex.message)
|
||||||
|
self.currentResult = True
|
||||||
|
#self.reporting_client.test_stop(Tes
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
# parser = argparse.ArgumentParser(description="Perfecto Arguments")
|
||||||
|
|
||||||
|
#parser.add_argument(
|
||||||
|
# "-c",
|
||||||
|
# "--cloud_name",
|
||||||
|
# metavar="cloud_name",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
#)
|
||||||
|
# parser.add_argument(
|
||||||
|
# "-s",
|
||||||
|
# "--security_token",
|
||||||
|
# metavar="security_token",
|
||||||
|
# help="Perfecto cloud name. (E.g. demo)",
|
||||||
|
# )
|
||||||
|
|
||||||
|
#args = vars(parser.parse_args())
|
||||||
|
|
||||||
|
#if not args["cloud_name"]:
|
||||||
|
# parser.print_help()
|
||||||
|
# parser.error(
|
||||||
|
# "cloud_name parameter is empty. Pass the argument -c followed by cloud_name"
|
||||||
|
# )
|
||||||
|
# exit
|
||||||
|
|
||||||
|
#print(str(args["cloud_name"]))
|
||||||
|
|
||||||
|
unittest.main()
|
||||||
Reference in New Issue
Block a user