我正在嘗試將所有這些工具結合在一起。這是我的專案的詳細資訊和一些螢屏截圖。我需要編譯后時間編織我的源代碼。
注解:
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Click {}
方面:
@Aspect
public class ClickAspect {
@Pointcut("@annotation(com.selenium.aspect.support.annotation.Click)")
public void clickAnn() {}
@Around("clickAnn()")
public void clickOnAction(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println("Clicking on a button");
joinPoint.proceed();
}
}
頁:
public class Page {
@FindBy(id = "menu-item-40489")
private WebElement search;
public Page(WebDriver driver) {
PageFactory.initElements(driver, this);
}
@Click
public void clickOnSearch() {
search.click();
}
}
測驗類:
public class SeleniumAspectSupportTest {
private WebDriver driver;
private Page page;
@BeforeTest
public void initDriver() {
System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
page = new Page(driver);
}
@AfterTest
public void dropDriver() {
driver.close();
}
@Test
public void simpleTest() {
driver.get("https://www.baeldung.com");
page.clickOnSearch();
System.out.println("DONE");
}
}
pom.xml:
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.11</version>
<configuration>
<complianceLevel>11</complianceLevel>
<source>11</source>
<target>11</target>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
aop.xml:
<?xml version="1.0" encoding="UTF-8"?>
<aspectj>
<aspects>
<aspect name="com.selenium.aspect.support.controller.ClickAspect"/>
</aspects>
</aspectj>
該建議不起作用,但測驗通過。我嘗試過不同的 aspectj 庫版本。我錯過了什么才能讓它發揮作用?
uj5u.com熱心網友回復:
在你的 POM、方面和測驗代碼中有幾件事情可以改進。但是你的問題的根本原因是該方面首先被AspectJ Maven Plugin編織到測驗類中,但由于Maven Compiler默認配置相當繁瑣而被Maven Compiler Plugin覆寫,導致它重新編譯所有內容。因此,您需要將此添加到您的 Maven 編譯器配置中:
<!-- IMPORTANT -->
<useIncrementalCompilation>false</useIncrementalCompilation>
你可以在我的回答中找到解釋。
其他你應該改進的地方:
- 升級到支持 Java 11 的更新的 AspectJ Maven 版本
- 將 AspectJ 依賴項升級到 1.9.7
- 擺脫
aspectjweaver依賴 andaop.xml,因為您已經使用了編譯時編織,并且不需要加載時編織配置。要么這個要么那個,但不能兩者兼而有之。 - 建立
aspectjtoolsMaven Compiler 依賴項,而不是 Maven 模塊本身的依賴項。您只需要插件內部的編譯器,而不是在運行時。有,aspectjrt就夠了。 - 優化您的切入點以僅包含
execution()連接點,否則每個方面建議將被觸發兩次,一次 forexecution和一次 forcall。運行測驗時,您可以在控制臺上看到這一點。 <showWeaveInfo>true</showWeaveInfo>為 AspectJ Maven激活。然后你也可以看到之前的問題,即雙重編織的建議,在編譯時更清楚。- 增強測驗以單擊 cookie 橫幅,這在我的情況下是必要的,以便在測驗期間甚至能夠單擊搜索按鈕。它還添加了用于
@Click觸發方面的第二個測驗用例。 - 就我而言,我不得不退出驅動程式,而不僅僅是關閉它。否則,我最終會得到幾十個
chromedriver.exe后臺行程。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.example</groupId>
<artifactId>SO_AJ_TestNGSelenium_69744638</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<aspectj.version>1.9.7</aspectj.version>
</properties>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${aspectj.version}</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.4.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<!-- IMPORTANT -->
<useIncrementalCompilation>false</useIncrementalCompilation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>aspectj-maven-plugin</artifactId>
<version>1.14.0</version>
<configuration>
<complianceLevel>11</complianceLevel>
<source>11</source>
<target>11</target>
<showWeaveInfo>true</showWeaveInfo>
</configuration>
<executions>
<execution>
<phase>process-sources</phase>
<goals>
<goal>compile</goal>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjtools</artifactId>
<version>${aspectj.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
package com.selenium.aspect.support.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Click {}
package org.example;
import com.selenium.aspect.support.annotation.Click;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
public class Page {
@FindBy(className = "css-47sehv")
private WebElement cookiesAgree;
@FindBy(id = "menu-item-40489")
private WebElement search;
public Page(WebDriver driver) {
PageFactory.initElements(driver, this);
}
@Click
public void clickOnCookiesAgree() {
cookiesAgree.click();
}
@Click
public void clickOnSearch() {
search.click();
}
}
package org.example;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
@Aspect
public class ClickAspect {
@Pointcut("@annotation(com.selenium.aspect.support.annotation.Click) && execution(* *(..))")
public void clickAnn() {}
@Around("clickAnn()")
public void clickOnAction(ProceedingJoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint " -> Clicking on a button");
joinPoint.proceed();
}
}
package org.example;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import java.util.concurrent.TimeUnit;
public class SeleniumAspectSupportTest {
private WebDriver driver;
private Page page;
@BeforeTest
public void initDriver() {
System.setProperty("webdriver.chrome.driver", "src/main/resources/chromedriver.exe");
driver = new ChromeDriver();
driver.manage().window().maximize();
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
driver.manage().timeouts().implicitlyWait(120, TimeUnit.SECONDS);
page = new Page(driver);
}
@AfterTest
public void dropDriver() {
driver.close();
driver.quit();
}
@Test
public void simpleTest() {
driver.get("https://www.baeldung.com");
page.clickOnCookiesAgree();
page.clickOnSearch();
System.out.println("DONE");
}
}
控制臺日志應為:
execution(void org.example.Page.clickOnCookiesAgree()) -> Clicking on a button
execution(void org.example.Page.clickOnSearch()) -> Clicking on a button
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/340883.html
上一篇:為什么Selenium通過xpath查找元素在Python中作業而在Java中出錯?
下一篇:使用硒存盤網頁中的值
