Ошибка «Нет основного атрибута манифеста» с Maven + TestNG + Selenium Grid2 - PullRequest
0 голосов
/ 28 мая 2018

Я хочу запустить Selenium Grid Hub, с моей структурой проекта Maven + TestNG.

Я добавил зависимость селена-сервера 3.12 в POM.XML и когда я вызываю этот селен-сервер из нашего проекта maven, это дает мне ошибку как «Нет основного атрибута манифеста».

Я сомневаюсь, чтобы я назвал "java -jar selenium-server-standalone-3.12.0.jar -role hub" Нужна ли нам внешняя загрузка этого Jar для Selenium Hub?Поскольку он уже импортирован в проект Maven.

Ошибка при настройке проекта Maven, «Нет атрибута основного манифеста»

C:\Users\Desktop-pc>java -jar org\seleniumhq\selenium\selenium-server\3.12.0\selenium-server-3.12.0.jar -role hub
no main manifest attribute, in org\seleniumhq\selenium\selenium-server\3.12.0\selenium-server-3.12.0.jar

Где, если я использую отдельную банку «Selenium Server Standalone», создается концентраторуспешно:

C:\>java -jar selenium-server-standalone-3.8.1.jar -role hub
16:05:07.614 INFO - Selenium build info: version: '3.8.1', revision: '6e95a6684b'
16:05:07.616 INFO - Launching Selenium Grid hub
2018-05-28 16:05:08.690:INFO::main: Logging initialized @1490ms to org.seleniumhq.jetty9.util.log.StdErrLog
16:05:08.707 INFO - Will listen on 4444
2018-05-28 16:05:08.823:INFO:osjs.Server:main: jetty-9.4.7.v20170914
2018-05-28 16:05:08.867:INFO:osjs.session:main: DefaultSessionIdManager workerName=node0
2018-05-28 16:05:08.868:INFO:osjs.session:main: No SessionScavenger set, using defaults
2018-05-28 16:05:08.871:INFO:osjs.session:main: Scavenging every 660000ms
2018-05-28 16:05:08.876:INFO:osjsh.ContextHandler:main: Started o.s.j.s.ServletContextHandler@1672fe87{/,null,AVAILABLE}
2018-05-28 16:05:11.946:INFO:osjs.AbstractConnector:main: Started ServerConnector@1816a71f{HTTP/1.1,[http/1.1]}{0.0.0.0:4444}
2018-05-28 16:05:11.948:INFO:osjs.Server:main: Started @4748ms
16:05:11.948 INFO - Nodes should register to http://localhost:4444/grid/register/
16:05:11.949 INFO - Selenium Grid hub is up and running

POM.XML

       <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass> ???? </mainClass>
                        </manifest>
                    </archive>
                </configuration>
       </plugin>

что мне нужно объявить в основном классе, если я использую @TestNG и его без статического основного классаметод.

Ответы [ 3 ]

0 голосов
/ 28 мая 2018

Без вашего подробного варианта использования Я не уверен в ваших точных требованиях.Но,

  • Для запуска Selenium Server вам нужно ввести команду как:

    java -jar selenium-server-standalone-3.12.0.jar
    
  • Комузапустите Selenium Grid Hub, вам нужно ввести команду как:

    java -jar selenium-server-standalone-3.12.0.jar -role hub
    
  • Если вы используете DefaultSelenium (или реализацию RemoteWebDriver), вам все равно нужно запустить Selenium Server , и для этого есть два возможных способа:

    • Лучший способ - загрузить selenium-server-standalone.jar. со страницы Selenium Downloads и просто используйте ее.

    • Кроме того, вы также можете встроить Selenium Server в ваш собственный проект, добавив следующую зависимость в ваш pom.xml:

      <dependency>
          <groupId>org.seleniumhq.selenium</groupId>
          <artifactId>selenium-server</artifactId>
          <version>3.12.0</version>
      </dependency>  
      

    Теперь вы можете самостоятельно создать экземпляр Selenium Server и запустить его.

Примечание : учтите, что артефакт selenium-server имеет зависимость от servlet-api-3.xy артефакт, который следует исключить, если ваш проект будет запускаться внутри контейнера веб-приложения.

Здесь вы найдете MavenИнформация на Selenium .


Обновление

Если вы пытаетесь запустить его из CLI , вам нужночтобы предоставить команду:

java -jar selenium-server-standalone-3.12.0.jar

Опция -jar работает только в том случае, если файл JAR представляет собой исполняемый файл JAR , что по сути означает, что он должен иметь файл манифеста с атрибутом Main-Class .

Более подробную информацию можно найти в Упаковка программ в JAR-файлах для создания исполняемого JAR .

Если JAR не следует этим правилам это не исполняемый файл jar .

Если это не исполняемый файл JAR , тогдавам нужно запустить программу следующим образом:

java -cp selenium-server-standalone-3.12.0.jar com.somepackage.SomeClass

, где com.somepackage.SomeClass - это Class , который содержит метод main для запуска программы.

Youможно найти подобное обсуждение в Невозможно выполнить jar-файл: «нет основного атрибута манифеста» .

0 голосов
/ 29 мая 2018

Selenium Grid обычно используется для удаленного выполнения, чтобы на вашем локальном компьютере не требовалось устанавливать браузеры (верно в случае сборочных машин, которые обычно представляют собой Linux-боксы без головок) или чтобы вы могли использовать свой локальный компьютер для чего-либоelse (верно для вашего локального ноутбука / настольного компьютера, когда вы запускаете тесты в режиме разработки).

Связывание Selenium Grid в вашем проекте (так, чтобы каждый раз, когда вы строите и запускаете тесты в своем проекте, селенсетка отключена) не очень хорошая идея.

Если вы все еще ищете запуск Selenium Grid локально (запуск Selenium Grid удаленно не только хакерский, но и требует много обходных путей и подверженмного сбоев) сначала, а затем, когда ваши тесты пользовательского интерфейса указывают на него, а затем выполняются, вы можете сделать это следующими способами:

  • Путем выделения Selenium Grid через плагин maven.

Для этого вам необходимо использовать maven-antrun-plugin.Ниже приведена типичная конфигурация того, как будет выглядеть плагин antrun (он вращается от концентратора с двумя подключенными к нему узлами). Источник этой информации был this thread

<build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-antrun-plugin</artifactId>
        <version>1.7</version>
        <executions>
          <execution>
            <phase>process-test-classes</phase>
            <configuration>
              <target>
                <java classname="org.openqa.grid.selenium.GridLauncherV3"
                  classpathref="maven.test.classpath"
                  failonerror="true"
                  fork="false">
                  <arg line="-role hub"/>
                </java>
                <java classname="org.openqa.grid.selenium.GridLauncherV3"
                  classpathref="maven.test.classpath"
                  failonerror="true"
                  fork="false">
                  <arg line="-role node"/>
                </java>
                <java classname="org.openqa.grid.selenium.GridLauncherV3"
                  classpathref="maven.test.classpath"
                  failonerror="true"
                  fork="false">
                  <arg line="-role node -port 6666"/>
                </java>
              </target>
            </configuration>
            <goals>
              <goal>run</goal>
            </goals>
          </execution>
        </executions>
      </plugin>
    </plugins>
</build>

.Приведенная выше конфигурация плагина предполагает, что selenium-server добавляется как test зависимость, то есть что-то вроде ниже

<dependency>
  <groupId>org.seleniumhq.selenium</groupId>
  <artifactId>selenium-server</artifactId>
  <version>3.12.0</version>
  <scope>test</scope>
</dependency>

Если у вас compile зависимость от времени selenium-server, пожалуйста, измените

classpathref="maven.test.classpath"

К

classpathref="maven.compile.classpath"

Более подробную информацию о classpathref см. В официальной документации .

Предупреждение:

Поскольку теперь Selenium Grid в основном регистрирует bean-компоненты для JMX, вы можете получить ошибку, такую ​​как приведенная ниже

08:28:09.529 INFO [GridLauncherV3$3.launch] - Launching a Selenium Grid node on port 6666
java.security.AccessControlException: access denied ("javax.management.MBeanTrustPermission" "register")
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:472)

В случае возникновения такой ошибки, пожалуйста, убедитесь, что вы открываетефайл с именем java.policy находится в %JAVA_HOME%\jre\lib\security\ и в разделе grant { добавьте permission javax.management.MBeanTrustPermission "register"; (источником этой информации был этот поток)

Теперь вы можете очень хорошо запустить свойTestNG тесты, запустив mvn clean test (И когда вы это сделаете, вы заметите селенсетка запускается локально)

  • Путем выделения Selenium Grid с помощью метода прослушивания / конфигурации TestNG.

Здесь вы в основном вращаетесьотключите концентратор и узел селена с помощью прослушивателя TestNG или с помощью метода конфигурации, а затем пусть ваши тесты просто указывают на локально развернутую сетку и запускаются против нее.

В приведенном ниже примере показан тест, который выполняется налокально раскручивать сетку (через метод конфигурации)

import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import org.openqa.grid.selenium.GridLauncherV3;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.BeforeSuite;
import org.testng.annotations.Test;

public class AnotherSample {
  private RemoteWebDriver driver;

  @BeforeSuite
  public void beforeSuite() throws InterruptedException {
    new Thread(
            () -> {
              String[] args = {"-role", "hub"};
              GridLauncherV3.main(args);
            })
        .start();
    new Thread(
            () -> {
              String[] args = {"-role", "node"};
              GridLauncherV3.main(args);
            })
        .start();
    // Lets wait for 10 seconds for the Hub and the node to be up and running
    TimeUnit.SECONDS.sleep(10);
  }

  @BeforeClass
  public void setup() throws MalformedURLException {
    driver =
        new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), new ChromeOptions());
  }

  @Test
  public void testMethod() {
    driver.get("http://www.google.com");
    System.err.println("Title = " + driver.getTitle());
  }

  @AfterClass
  public void cleanup() {
    if (driver != null) {
      driver.quit();
    }
  }
}
0 голосов
/ 28 мая 2018

Вы используете maven-jar-plugin , который используется для создания артефакта jar для обычного проекта Java.

Чтобы запустить аннотированные классы java-методов testNG, вам потребуется maven-surefire-plugin .Удалите maven-jar-plugin и замените его следующим блоком плагинов.

             <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.16</version>
                <configuration>
                    <skip>false</skip>
                    <testFailureIgnore>true</testFailureIgnore>
                </configuration>
            </plugin>
...