2017-08-25 12 views
0

私はJavaでSeleniumを使用して自動化ツールを作成しています。 WebDriverがFirefoxDriverの場合、次のコードは正常に動作しますが、HtmlUnitDriverに置き換えると、スパンをクリックするはずの行がクラッシュします。私はCSSセレクタとXPathの両方でスパンの位置を突き止めるようにしました。要素がロードされるまでドライバを待機させるHtmlUnitはSelenium、Javaのスパンをクリックできません

wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='home']/div[3]/div[3]/div[10]/div[3]/div[2]/div[1]/a/span"))); 

また、問題を解決しません。コードは次のとおりです。

WebDriver driver = new HtmlUnitDriver(BrowserVersion.FIREFOX_52); 

//driver.setJavascriptEnabled(true); 

WebDriverWait wait = new WebDriverWait(driver, 10); 

//logs in 
driver.get("https://www.tribalwars.net/"); 
driver.findElement(By.id("user")).clear(); 
driver.findElement(By.id("user")).sendKeys(username); 
driver.findElement(By.cssSelector("div.right.login > div.wrap")).click(); 
driver.findElement(By.id("password")).clear(); 
driver.findElement(By.id("password")).sendKeys(password); 
driver.findElement(By.cssSelector("a.btn-login")).click(); 

//It executes fine up until this point 

driver.findElement(By.cssSelector("span.world_button_active")).click(); 
/* 
This won't work either  
driver.findElement(By.xpath(".//*[@id='home']/div[3]/div[3]/div[10]/div[3]/div[2]/div[1]/a/span")).click(); 
*/ 

Iが与えられていますエラー:

Exception in thread "main" org.openqa.selenium.NoSuchElementException: Returned node was not a DOM element 
For documentation on this error, please visit: http://seleniumhq.org/exceptions/no_such_element.html 
Build info: version: 'unknown', revision: 'unknown', time: 'unknown' 
System info: host: 'PC', ip: '127.0.1.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.4.0-53-generic', java.version: '1.8.0_131' 
Driver info: driver.version: HtmlUnitDriver 
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElementByCssSelector(HtmlUnitDriver.java:1247) 
    at org.openqa.selenium.By$ByCssSelector.findElement(By.java:430) 
    at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1965) 
    at org.openqa.selenium.htmlunit.HtmlUnitDriver$5.call(HtmlUnitDriver.java:1) 
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.implicitlyWaitFor(HtmlUnitDriver.java:1601) 
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:1961) 
    at org.openqa.selenium.htmlunit.HtmlUnitDriver.findElement(HtmlUnitDriver.java:756) 
    at Bot.Test.build(Test.java:86) 
    at Bot.Test.main(Test.java:42) 
+0

span.world_button_activeのhtmlコードを投稿できますか? – smit9234

+0

try with elementToBeClickable(ロケータで)... – Grasshopper

+0

セレクタのようなサウンドが要素と一致しません。ブラウザのJSコンソールを開き、document.querySelector( "span.world_button_active");を実行してセレクタの動作を確認できますか?それが要素を返すかどうかを確認してください。 –

答えて

0

根本原因あなたHtmlUnitDriverはJavaScriptを実行していないです。あなたはそれをオンにする必要があります。

ただし、Webサイトにエラーがあるため、ドライバがクラッシュします。したがって、これらのエラーを許可するようにHtmlUnitDriverをカスタマイズする必要があります。

あなたがする必要があるのは、HtmlUnitDriverを継承し、エラースローをオフにするためにmodifyWebClientを上書きすることです。

import java.util.logging.Level; 
import java.util.logging.Logger; 

import org.openqa.selenium.htmlunit.HtmlUnitDriver; 

import com.gargoylesoftware.htmlunit.BrowserVersion; 
import com.gargoylesoftware.htmlunit.WebClient; 

public class MyHtmlUnitDriver extends HtmlUnitDriver { 

    public MyHtmlUnitDriver(BrowserVersion version, boolean enableJavascript) { 
     super(version, enableJavascript); 
    } 

    protected WebClient modifyWebClient(WebClient client) { 
     WebClient modifiedClient = super.modifyWebClient(client); 
     Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 
     modifiedClient.getOptions().setThrowExceptionOnScriptError(false); 
     modifiedClient.getOptions().setThrowExceptionOnFailingStatusCode(false); 
     modifiedClient.getOptions().setPrintContentOnFailingStatusCode(false); 
     return modifiedClient; 
    } 
} 

以下のコードは例です。

public void test() { 
    // Use a custom HtmlUnitDriver 
    WebDriver hd = new MyHtmlUnitDriver(BrowserVersion.FIREFOX_52, true); 
    WebDriverWait wait = new WebDriverWait(hd, 10); 

    hd.get("https://www.tribalwars.net/"); 
    hd.findElement(By.id("user")).clear(); 
    hd.findElement(By.id("user")).sendKeys(username); 
    hd.findElement(By.cssSelector("div.right.login > div.wrap")).click(); 
    hd.findElement(By.id("password")).clear(); 
    hd.findElement(By.id("password")).sendKeys(password); 
    hd.findElement(By.cssSelector("a.btn-login")).click(); 

    // Add Wait here 
    wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("span.world_button_active"))); 
    hd.findElement(By.cssSelector("span.world_button_active")).click(); 

P.S.代わりにPhantomJSまたはSlimmerJSを使うべきだと思います。

+0

ありがとう、それは働いた!しかし、なぜPhantomJSを使うべきですか? SeleniumのWebサイトによると、HtmlUnitは最も速い実装であり、PhantomJSを使用するとプラットフォーム固有のコードに依存する必要があります。 – HelloImRandom

+0

@HelloImRandomそれは私の意見です。 PhantomJSとSlimmerJSは実際のWebブラウザエンジンを使用していますが、HtmlUnitはRhinoを使用していますので、私は実際のエンジンを好みます。 – Buaban

関連する問題