diff --git a/src/portal/lib/src/project-policy-config/project-policy-config.component.html b/src/portal/lib/src/project-policy-config/project-policy-config.component.html index cc1b424b5..0519f95d6 100644 --- a/src/portal/lib/src/project-policy-config/project-policy-config.component.html +++ b/src/portal/lib/src/project-policy-config/project-policy-config.component.html @@ -20,8 +20,8 @@ {{ 'PROJECT_CONFIG.CONTENT_TRUST_POLCIY' | translate }} - - + + diff --git a/src/portal/lib/src/project-policy-config/project-policy-config.component.ts b/src/portal/lib/src/project-policy-config/project-policy-config.component.ts index 1e6aa270c..2d4f26fe3 100644 --- a/src/portal/lib/src/project-policy-config/project-policy-config.component.ts +++ b/src/portal/lib/src/project-policy-config/project-policy-config.component.ts @@ -70,6 +70,7 @@ export class ProjectPolicyConfigComponent implements OnInit { projectPolicy = new ProjectPolicy(); hasChangeConfigRole: boolean; severityOptions = [ + {severity: 'critical', severityLevel: 'VULNERABILITY.SEVERITY.CRITICAL'}, {severity: 'high', severityLevel: 'VULNERABILITY.SEVERITY.HIGH'}, {severity: 'medium', severityLevel: 'VULNERABILITY.SEVERITY.MEDIUM'}, {severity: 'low', severityLevel: 'VULNERABILITY.SEVERITY.LOW'}, diff --git a/src/portal/lib/src/vulnerability-scanning/result-grid.component.html b/src/portal/lib/src/vulnerability-scanning/result-grid.component.html index 4ebb30c87..89f1f427b 100644 --- a/src/portal/lib/src/vulnerability-scanning/result-grid.component.html +++ b/src/portal/lib/src/vulnerability-scanning/result-grid.component.html @@ -35,12 +35,12 @@ - {{severityText(res.severity) | translate}} - {{severityText(res.severity) | translate}} - {{severityText(res.severity) | translate}} - {{severityText(res.severity) | translate}} - {{severityText(res.severity) | translate}} - {{severityText(res.severity) | translate}} + {{severityText(res.severity) | translate}} + {{severityText(res.severity) | translate}} + {{severityText(res.severity) | translate}} + {{severityText(res.severity) | translate}} + {{severityText(res.severity) | translate}} + {{severityText(res.severity) | translate}} {{severityText(res.severity) | translate}} {{res.package}} diff --git a/src/portal/lib/src/vulnerability-scanning/scanning.scss b/src/portal/lib/src/vulnerability-scanning/scanning.scss index c462c9637..a68e05a93 100644 --- a/src/portal/lib/src/vulnerability-scanning/scanning.scss +++ b/src/portal/lib/src/vulnerability-scanning/scanning.scss @@ -164,3 +164,6 @@ hr{ .margin-top-m15{ margin-top: -15px; } +.no-border { + border: none; +} diff --git a/src/portal/src/app/app.module.ts b/src/portal/src/app/app.module.ts index 7363ef3b1..c4709a6b1 100644 --- a/src/portal/src/app/app.module.ts +++ b/src/portal/src/app/app.module.ts @@ -39,6 +39,10 @@ import { VulnerabilityPageComponent } from './vulnerability-page/vulnerability-p import { GcPageComponent } from './gc-page/gc-page.component'; import { OidcOnboardModule } from './oidc-onboard/oidc-onboard.module'; import { LicenseModule } from './license/license.module'; +import { InterrogationServicesComponent } from "./interrogation-services/interrogation-services.component"; +import { LabelsComponent } from './labels/labels.component'; +import { ProjectQuotasComponent } from './project-quotas/project-quotas.component'; + registerLocaleData(zh, 'zh-cn'); registerLocaleData(es, 'es-es'); registerLocaleData(localeFr, 'fr-fr'); @@ -61,7 +65,10 @@ export function getCurrentLanguage(translateService: TranslateService) { AppComponent, ProjectConfigComponent, VulnerabilityPageComponent, - GcPageComponent + GcPageComponent, + InterrogationServicesComponent, + LabelsComponent, + ProjectQuotasComponent ], imports: [ BrowserModule, diff --git a/src/portal/src/app/base/harbor-shell/harbor-shell.component.html b/src/portal/src/app/base/harbor-shell/harbor-shell.component.html index f15c1e941..7ba9ecbf2 100644 --- a/src/portal/src/app/base/harbor-shell/harbor-shell.component.html +++ b/src/portal/src/app/base/harbor-shell/harbor-shell.component.html @@ -41,26 +41,28 @@ {{'SIDE_NAV.SYSTEM_MGMT.REPLICATION' | translate}} - - - - - {{'SIDE_NAV.TASKS' | translate}} - - - - {{'SIDE_NAV.SYSTEM_MGMT.VULNERABILITY' | translate}} + + + {{'CONFIG.LABEL' | translate }} + + + + {{'CONFIG.PROJECT_QUOTAS' | translate }} + + + + {{'SIDE_NAV.SYSTEM_MGMT.INTERROGATION_SERVICES' | translate}} + {{'SIDE_NAV.SYSTEM_MGMT.GARBAGE_COLLECTION' | translate}} + + + {{'SIDE_NAV.SYSTEM_MGMT.CONFIG' | translate}} + - - - {{'SIDE_NAV.SYSTEM_MGMT.CONFIG' | translate}} - diff --git a/src/portal/src/app/gc-page/gc-page.component.scss b/src/portal/src/app/gc-page/gc-page.component.scss index 638f7dcb7..dfd969db2 100644 --- a/src/portal/src/app/gc-page/gc-page.component.scss +++ b/src/portal/src/app/gc-page/gc-page.component.scss @@ -1,3 +1,6 @@ .gc-title { display: inline-block; -} \ No newline at end of file +} +.v-mid { + vertical-align: middle; +} diff --git a/src/portal/src/app/harbor-routing.module.ts b/src/portal/src/app/harbor-routing.module.ts index eb50796e7..476bbe777 100644 --- a/src/portal/src/app/harbor-routing.module.ts +++ b/src/portal/src/app/harbor-routing.module.ts @@ -62,8 +62,13 @@ import { LicenseComponent } from './license/license.component'; import { SummaryComponent } from './project/summary/summary.component'; import { TagRetentionComponent } from './project/tag-retention/tag-retention.component'; import { ImmutableTagComponent } from './project/immutable-tag/immutable-tag.component'; -import { USERSTATICPERMISSION } from '@harbor/ui'; +import { USERSTATICPERMISSION, VulnerabilityConfigComponent } from '@harbor/ui'; import { ScannerComponent } from "./project/scanner/scanner.component"; +import { InterrogationServicesComponent } from "./interrogation-services/interrogation-services.component"; +import { ConfigurationScannerComponent } from "./config/scanner/config-scanner.component"; +import { LabelsComponent } from "./labels/labels.component"; +import { ProjectQuotasComponent } from "./project-quotas/project-quotas.component"; + const harborRoutes: Routes = [ { path: '', redirectTo: 'harbor', pathMatch: 'full' }, @@ -122,6 +127,37 @@ const harborRoutes: Routes = [ canActivate: [SystemAdminGuard], canActivateChild: [SystemAdminGuard] }, + { + path: 'interrogation-services', + component: InterrogationServicesComponent, + canActivate: [SystemAdminGuard], + canActivateChild: [SystemAdminGuard], + children: [ + { + path: 'scanners', + component: ConfigurationScannerComponent + }, + { + path: 'vulnerability', + component: VulnerabilityConfigComponent + }, + { + path: '', + redirectTo: 'scanners', + pathMatch: 'full' + }, + ] + }, + { + path: 'labels', + component: LabelsComponent, + canActivate: [SystemAdminGuard], + }, + { + path: 'project-quotas', + component: ProjectQuotasComponent, + canActivate: [SystemAdminGuard], + }, { path: 'replications/:id/:tasks', component: ReplicationTasksPageComponent, diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.html b/src/portal/src/app/interrogation-services/interrogation-services.component.html new file mode 100644 index 000000000..c674f81da --- /dev/null +++ b/src/portal/src/app/interrogation-services/interrogation-services.component.html @@ -0,0 +1,14 @@ +

{{'SIDE_NAV.SYSTEM_MGMT.INTERROGATION_SERVICES' | translate}}

+
+ + + diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.scss b/src/portal/src/app/interrogation-services/interrogation-services.component.scss new file mode 100644 index 000000000..3d5e2656f --- /dev/null +++ b/src/portal/src/app/interrogation-services/interrogation-services.component.scss @@ -0,0 +1,26 @@ +.sub-header-title { + margin-top: 12px; + margin-bottom: 12px; +} + +.sub-nav-bg-color { + background-color: #fafafa; +} + +.subnav { + .nav { + padding-left: 0; + } +} + +.role-label { + color: #CCCCCC; + font-size: 14px; + font-style: italic; + letter-spacing: 0.01em; +} +.backStyle{ + color: #007cbb; + font-size: 12px; + cursor: pointer; +} diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts b/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts new file mode 100644 index 000000000..5a437cdd2 --- /dev/null +++ b/src/portal/src/app/interrogation-services/interrogation-services.component.spec.ts @@ -0,0 +1,37 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { InterrogationServicesComponent } from './interrogation-services.component'; +import { SharedModule } from "../shared/shared.module"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { ClarityModule } from "@clr/angular"; +import { TranslateService } from "@ngx-translate/core"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; + +describe('InterrogationServicesComponent', () => { + let component: InterrogationServicesComponent; + let fixture: ComponentFixture; + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + SharedModule, + BrowserAnimationsModule, + ClarityModule, + ], + declarations: [ InterrogationServicesComponent ], + providers: [TranslateService], + schemas: [ + CUSTOM_ELEMENTS_SCHEMA + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(InterrogationServicesComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/portal/src/app/interrogation-services/interrogation-services.component.ts b/src/portal/src/app/interrogation-services/interrogation-services.component.ts new file mode 100644 index 000000000..8c2280c75 --- /dev/null +++ b/src/portal/src/app/interrogation-services/interrogation-services.component.ts @@ -0,0 +1,15 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-interrogation-services', + templateUrl: './interrogation-services.component.html', + styleUrls: ['./interrogation-services.component.scss'] +}) +export class InterrogationServicesComponent implements OnInit { + + constructor( + ) {} + + ngOnInit() { + } +} diff --git a/src/portal/src/app/labels/labels.component.html b/src/portal/src/app/labels/labels.component.html new file mode 100644 index 000000000..a1ec87d01 --- /dev/null +++ b/src/portal/src/app/labels/labels.component.html @@ -0,0 +1,5 @@ +

{{'CONFIG.LABEL' | translate }}

+ diff --git a/src/portal/src/app/labels/labels.component.spec.ts b/src/portal/src/app/labels/labels.component.spec.ts new file mode 100644 index 000000000..91fe512e5 --- /dev/null +++ b/src/portal/src/app/labels/labels.component.spec.ts @@ -0,0 +1,39 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { LabelsComponent } from './labels.component'; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { TranslateService } from "@ngx-translate/core"; +import { ClarityModule } from "@clr/angular"; +import { BrowserAnimationsModule } from "@angular/platform-browser/animations"; +import { SharedModule } from "../shared/shared.module"; + +describe('LabelsComponent', () => { + let component: LabelsComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + SharedModule, + BrowserAnimationsModule, + ClarityModule, + ], + declarations: [ LabelsComponent ], + providers: [TranslateService], + schemas: [ + CUSTOM_ELEMENTS_SCHEMA + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(LabelsComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/portal/src/app/labels/labels.component.ts b/src/portal/src/app/labels/labels.component.ts new file mode 100644 index 000000000..67d557192 --- /dev/null +++ b/src/portal/src/app/labels/labels.component.ts @@ -0,0 +1,14 @@ +import { Component, OnInit } from '@angular/core'; + +@Component({ + selector: 'app-labels', + templateUrl: './labels.component.html', +}) +export class LabelsComponent implements OnInit { + + constructor() { } + + ngOnInit() { + } + +} diff --git a/src/portal/src/app/project-quotas/project-quotas.component.html b/src/portal/src/app/project-quotas/project-quotas.component.html new file mode 100644 index 000000000..48bce381f --- /dev/null +++ b/src/portal/src/app/project-quotas/project-quotas.component.html @@ -0,0 +1,2 @@ +

{{'CONFIG.PROJECT_QUOTAS' | translate }}

+ diff --git a/src/portal/src/app/project-quotas/project-quotas.component.scss b/src/portal/src/app/project-quotas/project-quotas.component.scss new file mode 100644 index 000000000..e8c5586b8 --- /dev/null +++ b/src/portal/src/app/project-quotas/project-quotas.component.scss @@ -0,0 +1,3 @@ +.v-mid { + vertical-align: middle; +} diff --git a/src/portal/src/app/project-quotas/project-quotas.component.spec.ts b/src/portal/src/app/project-quotas/project-quotas.component.spec.ts new file mode 100644 index 000000000..fcaa9c559 --- /dev/null +++ b/src/portal/src/app/project-quotas/project-quotas.component.spec.ts @@ -0,0 +1,73 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ProjectQuotasComponent } from './project-quotas.component'; +import { TranslateModule } from "@ngx-translate/core"; +import { CUSTOM_ELEMENTS_SCHEMA } from "@angular/core"; +import { MessageHandlerService } from "../shared/message-handler/message-handler.service"; +import { SessionService } from "../shared/session.service"; +import { SessionUser } from "../shared/session-user"; +import { ConfigurationService } from "../config/config.service"; +import { Configuration } from "@harbor/ui"; +import { of } from "rxjs"; + +describe('ProjectQuotasComponent', () => { + let component: ProjectQuotasComponent; + let fixture: ComponentFixture; + const mockedUser: SessionUser = { + user_id: 1, + username: 'admin', + email: 'harbor@vmware.com', + realname: 'admin', + has_admin_role: true, + comment: 'no comment' + }; + let mockedConfig: Configuration = new Configuration(); + mockedConfig.count_per_project.value = 10; + const fakedSessionService = { + getCurrentUser() { + return mockedUser; + } + }; + const fakedConfigurationService = { + getConfiguration() { + return of(mockedConfig); + } + }; + const fakedMessageHandlerService = { + handleError() { + return; + } + }; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + imports: [ + TranslateModule.forRoot() + ], + declarations: [ ProjectQuotasComponent ], + providers: [ + MessageHandlerService, + {provide: MessageHandlerService, useValue: fakedMessageHandlerService}, + {provide: SessionService, useValue: fakedSessionService}, + {provide: ConfigurationService, useValue: fakedConfigurationService} + ], + schemas: [ + CUSTOM_ELEMENTS_SCHEMA + ], + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(ProjectQuotasComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); + + it('should get config', () => { + expect(component.allConfig.count_per_project.value).toEqual(10); + }); +}); diff --git a/src/portal/src/app/project-quotas/project-quotas.component.ts b/src/portal/src/app/project-quotas/project-quotas.component.ts new file mode 100644 index 000000000..6b3e04c91 --- /dev/null +++ b/src/portal/src/app/project-quotas/project-quotas.component.ts @@ -0,0 +1,40 @@ +import { Component, OnInit } from '@angular/core'; +import { Configuration } from "@harbor/ui"; +import { SessionService } from "../shared/session.service"; +import { ConfigurationService } from "../config/config.service"; +import { MessageHandlerService } from "../shared/message-handler/message-handler.service"; +import { finalize } from "rxjs/operators"; + +@Component({ + selector: 'app-project-quotas', + templateUrl: './project-quotas.component.html', + styleUrls: ['./project-quotas.component.scss'] +}) +export class ProjectQuotasComponent implements OnInit { + allConfig: Configuration = new Configuration(); + loading: boolean = false; + constructor(private session: SessionService, + private configService: ConfigurationService, + private msgHandler: MessageHandlerService) { } + + ngOnInit() { + let currentUser = this.session.getCurrentUser(); + if (currentUser && currentUser.has_admin_role) { + this.retrieveConfig(); + } + } + + refreshAllconfig() { + this.retrieveConfig(); + } + retrieveConfig(): void { + this.loading = true; + this.configService.getConfiguration() + .pipe(finalize(() => this.loading = false)) + .subscribe((configurations: Configuration) => { + this.allConfig = configurations; + }, error => { + this.msgHandler.handleError(error); + }); + } +} diff --git a/src/portal/src/app/project/scanner/scanner.component.html b/src/portal/src/app/project/scanner/scanner.component.html index 0e0dfd59f..fb919eb26 100644 --- a/src/portal/src/app/project/scanner/scanner.component.html +++ b/src/portal/src/app/project/scanner/scanner.component.html @@ -74,7 +74,7 @@ {{scanner.name}} {{scanner.url}} - + {{scanner.is_default}} {{scanner.is_default}} diff --git a/src/portal/src/global.scss b/src/portal/src/global.scss index c268a4c18..d925c59e0 100644 --- a/src/portal/src/global.scss +++ b/src/portal/src/global.scss @@ -288,3 +288,7 @@ .float-lg-right { float: right; } + +.position-relative { + position: relative; +} diff --git a/src/portal/src/i18n/lang/en-us-lang.json b/src/portal/src/i18n/lang/en-us-lang.json index 73e18a4e5..7b71d1c9e 100644 --- a/src/portal/src/i18n/lang/en-us-lang.json +++ b/src/portal/src/i18n/lang/en-us-lang.json @@ -166,7 +166,8 @@ "REPLICATION": "Replications", "CONFIG": "Configuration", "VULNERABILITY": "Vulnerability", - "GARBAGE_COLLECTION": "Garbage Collection" + "GARBAGE_COLLECTION": "Garbage Collection", + "INTERROGATION_SERVICES": "Interrogation Services" }, "LOGS": "Logs", "TASKS": "Tasks", diff --git a/src/portal/src/i18n/lang/es-es-lang.json b/src/portal/src/i18n/lang/es-es-lang.json index 7f79e3881..f5ed5e138 100644 --- a/src/portal/src/i18n/lang/es-es-lang.json +++ b/src/portal/src/i18n/lang/es-es-lang.json @@ -166,7 +166,8 @@ "REPLICATION": "Replicacións", "CONFIG": "Configuración", "VULNERABILITY": "Vulnerability", - "GARBAGE_COLLECTION": "Garbage Collection" + "GARBAGE_COLLECTION": "Garbage Collection", + "INTERROGATION_SERVICES": "Interrogation Services" }, "LOGS": "Logs", "TASKS": "Tasks", diff --git a/src/portal/src/i18n/lang/fr-fr-lang.json b/src/portal/src/i18n/lang/fr-fr-lang.json index 7132718a8..e134761a0 100644 --- a/src/portal/src/i18n/lang/fr-fr-lang.json +++ b/src/portal/src/i18n/lang/fr-fr-lang.json @@ -160,7 +160,8 @@ "REPLICATION": "Réplication", "CONFIG": "Configuration", "VULNERABILITY": "Vulnerability", - "GARBAGE_COLLECTION": "Garbage Collection" + "GARBAGE_COLLECTION": "Garbage Collection", + "INTERROGATION_SERVICES": "Interrogation Services" }, "LOGS": "Logs", "TASKS": "Tasks", diff --git a/src/portal/src/i18n/lang/pt-br-lang.json b/src/portal/src/i18n/lang/pt-br-lang.json index 208ebb847..6d2b9640e 100644 --- a/src/portal/src/i18n/lang/pt-br-lang.json +++ b/src/portal/src/i18n/lang/pt-br-lang.json @@ -164,7 +164,8 @@ "REPLICATION": "Replicações", "CONFIG": "Configuração", "VULNERABILITY": "Vulnerability", - "GARBAGE_COLLECTION": "Garbage Collection" + "GARBAGE_COLLECTION": "Garbage Collection", + "INTERROGATION_SERVICES": "Interrogation Services" }, "LOGS": "Logs", "TASKS": "Tasks", diff --git a/src/portal/src/i18n/lang/tr-tr-lang.json b/src/portal/src/i18n/lang/tr-tr-lang.json index 453123d77..cfbe4cdc8 100644 --- a/src/portal/src/i18n/lang/tr-tr-lang.json +++ b/src/portal/src/i18n/lang/tr-tr-lang.json @@ -166,7 +166,8 @@ "REPLICATION": "Kopyalama", "CONFIG": "Yapılandırma", "VULNERABILITY": "Güvenlik Açığı", - "GARBAGE_COLLECTION": "Çöp toplama" + "GARBAGE_COLLECTION": "Çöp toplama", + "INTERROGATION_SERVICES": "Interrogation Services" }, "LOGS": "Kayıtlar", "TASKS": "Görevler", diff --git a/src/portal/src/i18n/lang/zh-cn-lang.json b/src/portal/src/i18n/lang/zh-cn-lang.json index 1ff46102f..7850ed10f 100644 --- a/src/portal/src/i18n/lang/zh-cn-lang.json +++ b/src/portal/src/i18n/lang/zh-cn-lang.json @@ -165,7 +165,8 @@ "REPLICATION": "同步管理", "CONFIG": "配置管理", "VULNERABILITY": "漏洞", - "GARBAGE_COLLECTION": "垃圾清理" + "GARBAGE_COLLECTION": "垃圾清理", + "INTERROGATION_SERVICES": "审查服务" }, "LOGS": "日志", "TASKS": "任务", diff --git a/tests/resources/Harbor-Pages/Configuration.robot b/tests/resources/Harbor-Pages/Configuration.robot index e2e04a21d..d619698a1 100644 --- a/tests/resources/Harbor-Pages/Configuration.robot +++ b/tests/resources/Harbor-Pages/Configuration.robot @@ -154,9 +154,7 @@ Switch To System Settings Switch To Project Quotas Sleep 1 - Retry Element Click xpath=${configuration_xpath} - Retry Element Click xpath=${configuration_system_tabsheet_id} - Retry Element Click xpath=${configuration_project_quotas_tabsheet_id} + Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Project Quotas')] Sleep 1 Modify Token Expiration @@ -243,8 +241,7 @@ Disable Read Only ## System labels Switch To System Labels Sleep 1 - Retry Element Click xpath=${configuration_xpath} - Retry Element Click xpath=//*[@id='config-label'] + Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Labels')] ## System labels Switch To Configuration System Setting @@ -254,8 +251,7 @@ Switch To Configuration System Setting Switch To Configuration Project Quotas Sleep 1 - Retry Element Click xpath=${configuration_xpath} - Retry Element Click xpath=${configuration_project_quotas} + Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Project Quotas')] Create New Labels [Arguments] ${labelname} @@ -337,4 +333,4 @@ Get Project Storage Quota Text From Project Quotas List [Arguments] ${project_name} Switch To Project Quotas ${storage_quota}= Get Text xpath=//project-quotas//clr-datagrid//clr-dg-row[contains(.,'${project_name}')]//clr-dg-cell[4]//label - [Return] ${storage_quota} \ No newline at end of file + [Return] ${storage_quota} diff --git a/tests/resources/Harbor-Pages/Vulnerability.robot b/tests/resources/Harbor-Pages/Vulnerability.robot index 687b4e7aa..854b82c01 100644 --- a/tests/resources/Harbor-Pages/Vulnerability.robot +++ b/tests/resources/Harbor-Pages/Vulnerability.robot @@ -18,7 +18,8 @@ Trigger Scan Now Sleep 10 Switch To Vulnerability Page - Retry Element Click xpath=${vulnerability_page} + Retry Element Click xpath=//clr-main-container//clr-vertical-nav//a[contains(.,'Interrogation')] + Retry Element Click xpath=//app-interrogation-services//a[contains(.,'Vulnerability')] Retry Wait Element ${scan_now_button}