Зачем нужна библиотека xml-apis, WebDriverFactory?


(Alex) #1

Нашел у себя в POM зависимость:

<dependency>
   <groupId>xml-apis</groupId>
   <artifactId>xml-apis</artifactId>
    <version>1.4.01</version>
</dependency>

Если удалить ее, то браузер даже не открывается. И в лог сыпятся ошибки:

java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at java.net.URLClassLoader.defineClass(URLClassLoader.java:455)
    at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:367)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    at org.apache.xerces.parsers.AbstractDOMParser.startDocument(Unknown Source)
    at org.apache.xerces.impl.dtd.XMLDTDValidator.startDocument(Unknown Source)
    at org.apache.xerces.impl.XMLDocumentScannerImpl.startEntity(Unknown Source)
    at org.apache.xerces.impl.XMLVersionDetector.startDocumentParsing(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
    at org.apache.xerces.parsers.DOMParser.parse(Unknown Source)
    at org.apache.xerces.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:205)
    at org.openqa.selenium.firefox.internal.FileExtension.readIdFromInstallRdf(FileExtension.java:97)
    at org.openqa.selenium.firefox.internal.FileExtension.writeTo(FileExtension.java:60)
    at org.openqa.selenium.firefox.internal.ClasspathExtension.writeTo(ClasspathExtension.java:63)
    at org.openqa.selenium.firefox.FirefoxProfile.installExtensions(FirefoxProfile.java:425)
    at org.openqa.selenium.firefox.FirefoxProfile.layoutOnDisk(FirefoxProfile.java:403)
    at org.openqa.selenium.firefox.internal.NewProfileExtensionConnection.start(NewProfileExtensionConnection.java:89)
    at org.openqa.selenium.firefox.FirefoxDriver.startClient(FirefoxDriver.java:246)
    at org.openqa.selenium.remote.RemoteWebDriver.<init>(RemoteWebDriver.java:114)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:191)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:186)
    at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:103)
    at ru.stqa.selenium.factory.WebDriverFactoryInternal.createLocalDriver(WebDriverFactoryInternal.java:74)
    at ru.stqa.selenium.factory.WebDriverFactoryInternal.newDriver(WebDriverFactoryInternal.java:58)
    at ru.stqa.selenium.factory.ThreadLocalSingletonStorage.createNewDriver(ThreadLocalSingletonStorage.java:91)
    at ru.stqa.selenium.factory.ThreadLocalSingletonStorage.getDriver(ThreadLocalSingletonStorage.java:36)
    at ru.stqa.selenium.factory.WebDriverFactoryInternal.getDriver(WebDriverFactoryInternal.java:49)
    at ru.stqa.selenium.factory.WebDriverFactory.getDriver(WebDriverFactory.java:39)
    at com.sl.conf.ConfigDriver.<clinit>(ConfigDriver.java:26)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)
    at org.junit.runners.BlockJUnit4ClassRunner.createTest(BlockJUnit4ClassRunner.java:217)
    at org.junit.runners.BlockJUnit4ClassRunner$1.runReflectiveCall(BlockJUnit4ClassRunner.java:266)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
    at org.junit.runners.BlockJUnit4ClassRunner.methodBlock(BlockJUnit4ClassRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
    at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:283)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeWithRerun(JUnit4Provider.java:173)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:153)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:128)
    at org.apache.maven.surefire.booter.ForkedBooter.invokeProviderInSameClassLoader(ForkedBooter.java:203)
    at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:155)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:103)
***
java.lang.NoClassDefFoundError: Could not initialize class com.sl.test.TestKaraoke
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408)

В дебаге указывает что ошибка произошла в методе WebDriverFactory.getDriver(firefox);

public class ConfigDriver {

    protected static Capabilities firefox = DesiredCapabilities.firefox();
    protected static WebDriver driver = WebDriverFactory.getDriver(firefox);

Каким образом WebDriverFactory использует эту библиотеку и как она в данном случае работает?


(Борис Осипов) #2

А выкачть сорцы firefox драйвера и посмотреть? wink

Судя по коду там происходит разбор install.rdf - это xml описание манифестов расширений firefox.


(Alex) #3

Я пока очень путаюсь когда вижу чужой код. И думаю легче спросить нежели "время" потратить на понимание чужого кода.


(Sergey Korol) #4

В новой IntelliJ IDEA есть встроенный декомпилятор. Уже не нужно ничего скачивать / лезть в web за исходниками. CTRL + left mouse click = full source code любого класса любой 3rd party библиотеки.

По теме: подозреваю, что WebDriverFactory - это самописная реализация одного из активистов комьюнити. Так что вопрос - почему фабрике нужна эта зависимость - лучше задавать самому автору, если лень копаться в исходниках.

И уж поверьте, загуглить ответ выйдет куда быстрее, нежели тратить "время" на создание поста и потом ждать N часов ответа. wink


(Alex) #5

Спасибо, но вы уже ответили.

P.S. однажды был случай когда я искал решение проблемы и открыв первую ссылку google обнаружил ответ на форуме с закрытой темой, а ответ на вопрос был такой "не легче в гугле поискать нежели заводить подобные темы" =)) Вот такой парадокс.


(Sergey Korol) #6

Есть задачи, которые в принципе не стоят того, чтобы тратить на них время. Вы же сейчас тратите свое на совершенно бесполезные вещи.

Ранее технологии развивались очень медленно и люди были уверены в том, что завтра ровным счетом ничего не изменится. Информация передавалась туго. Посему, все досконально изучали каждую буковку в учебниках по программированию. Знали наизусть каждую API изнутри. Нынче же, кол-во всевозможных языков и технологий разрослось до такого кол-ва, что держать лишнюю информацию в голове - непозволительная роскошь. Вас не должно волновать, зачем та или иная библиотека использует определенные депенденси, если только она не лочит вам всю разработку.

Пока вы будете зацикливаться на конкретной технологии, досконально ее изучая, рискуете потерять темп развития НТП и навсегда остаться в прошлом. Как сказал в свое время один неглупый профессор: вооружен не тот, кто все знает (ибо сейчас это невозможно), а тот кто знает, где быстро найти нужную информацию и как ей качественно воспользоваться. Важен результат, причем быстрый. А если вы потратите 3 дня на глубокое изучение каких-то исходников, которые в итоге совершенно вам не подойдут, спасибо вам никто не скажет, ибо решение задачи в срок будет поставлено под вопрос.

Естественно у вас должна быть приличная тех. база для того, чтобы читать чужой код. Но какой профит вы от этого получите! Хороший бэкграунд + умение быстро найти нужную информацию = невероятная гибкость и умение адаптироваться.

Любой, умеющий читать код, сможет найти ответ на ваш вопрос. Но придется делать то, на что вам было лень потратить свое время. И ладно, если бы оно того стоило. К примеру, продакшен блокер, все валится из-за этой депенденси и т.п. - это одно дело. А чисто ради любопытства начать изучать внутренности - извольте, но лучше потратить это время на чтение новой главы Java Core. wink


(Alex) #7

Мне не лень, просто иногда не знаешь с чего начать. А много слов в чужом коде пугают. Но тот вопрос который я задал, это и называется, что я не хочу терять времени на этой библиотеке, так как если в будущем ее нужно будет удалить, я смог без проблем сделать это. Спасибо за совет.