カテゴリ: selenium

		usr_element.sendKeys("oreore");
		pwd_element.sendKeys("password");
		try{
			form_element.submit(); // ここで例外
		}catch(org.openqa.selenium.JavascriptException e){
			logger.log(Level.WARNING, "失敗したが続ける", e);
		}
		String title = driver.getTitle(); // ログイン後の画面に遷移して、タイトル取得に成功する

で、以下の例外が起こる(ただし何故かsubmitの効果はあってちゃんとログインは出来て次の画面に遷移する)。

org.openqa.selenium.JavascriptException: TypeError: form.submit is not a function
Build info: version: '3.4.0', revision: 'unknown', time: 'unknown'
System info: host: 'hogehoge', ip: '127.0.0.1', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_131'
Driver info: org.openqa.selenium.firefox.FirefoxDriver
Capabilities [{moz:profile=C:\Users\oreore\AppData\Local\Temp\rust_mozprofile.bpO0rmnWE9ko, rotatable=false, timeouts={implicit=0.0, pageLoad=300000.0, script=30000.0}, pageLoadStrategy=normal, platform=ANY, specificationLevel=0.0, moz:accessibilityChecks=false, acceptInsecureCerts=false, browserVersion=53.0.3, platformVersion=10.0, moz:processID=7144.0, browserName=firefox, javascriptEnabled=true, platformName=windows_nt}]
Session ID: aaaaaaaa
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	at java.lang.reflect.Constructor.newInstance(Unknown Source)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:150)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:115)
	at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:45)
	at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:164)
	at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
	at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
	at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:272)
	at org.openqa.selenium.remote.RemoteWebElement.submit(RemoteWebElement.java:86)
	at seleniumtest.main.Main.exec(Main.java:45)
	at seleniumtest.main.Main.main(Main.java:17)

検索したら
https://stackoverflow.com/questions/32534202/uncaught-typeerror-document-getelementbyid-submit-is-not-a-function
どうも、formタグの子に、idかnameが"submit"という名前の要素があると起こるらしい。
まぁ今回はログイン自体は出来たので良いけど。

このエントリーをはてなブックマークに追加 mixiチェック

 ところでウェブドライバーってウェブダイバーに似てるよな。
 ちなみにApache HttpClientは馬鹿正直というか、オレオレ署名対応とか古いTLS1.0対応とかまずSSL接続をする段階で何かと喧しくて面倒なのでスルー。
 それにしてもちょっと社内システムから情報引っ張るのにHTTPクライアントでアクセスしてHTMLを解析パースするのって如何なものかと思うんだが、そんなに本格的必要不可欠システムでもないのでまさかポート1521開けてくれとも言いづらいし、我々がちょっと使うためだけに向こうにSOAPだかRESTだかとにかく80あるいは443で通信する口を作ってテストして責任もって保守を続けてくれ、とも言いにくい。SOA! SOA!
 まぁHTMLパースはHTMLCleaner掛けてしまえばただのXMLなので楽ちんなんだけど、社内システムはログインが結構面倒で結局seleniumなどという無駄に重いものを使わざるを得なくなった。いやまだできたわけではないが多分できる筈。そもそもselenium使った事ないけどな。まぁネットで見た限りではそんなに難しいものでもなさそうだし。
 この類は、Oracle ATSが結構使いやすいんだがあれも相当なスペックのハードを準備しないといけないからな。OracleはやたらOracle Database+Fusion Middlewareで実装するのでちょっとしたツールでもたちまちエンタープライズシステム並みのハードが必要になる。というか高いし。
 それにしてもivyでseleniumを入れると物凄い量のjarが入るな…。なんでguavaやjettyまで…。

package seleniumtest;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;

public class Main {

	public static void main(String[] args) {
		Main my = new Main();
		my.exec(args);
	}
	
	private void exec(String[] args){
		System.setProperty("webdriver.gecko.driver","./driver/geckodriver.exe");
		WebDriver driver = new FirefoxDriver();
		driver.get("http://nekora.main.jp/");
		
		// driver.close(); //firefoxを閉じる
	}
}

ivyで勝手に入るjarの他に、https://github.com/mozilla/geckodriver/releases から別途DLしたzipを解凍して geckodriver.exe をどこかに置いて、それをシステムプロパティで指定することが必要だった。
https://stackoverflow.com/questions/19953865/why-there-is-no-need-of-external-firefox-driver-like-ie-and-chrome-in-selenium2
には、firefoxドライバだけはこういうことは不要と書いてあるんだが…。
ちなみに入れないと以下のエラー

Exception in thread "main" java.lang.IllegalStateException: The path to the driver executable must be set by the webdriver.gecko.driver system property; for more information, see https://github.com/mozilla/geckodriver. The latest version can be downloaded from https://github.com/mozilla/geckodriver/releases
	at com.google.common.base.Preconditions.checkState(Preconditions.java:738)
	at org.openqa.selenium.remote.service.DriverService.findExecutable(DriverService.java:124)
	at org.openqa.selenium.firefox.GeckoDriverService.access$100(GeckoDriverService.java:41)
	at org.openqa.selenium.firefox.GeckoDriverService$Builder.findDefaultExecutable(GeckoDriverService.java:115)
	at org.openqa.selenium.remote.service.DriverService$Builder.build(DriverService.java:330)
	at org.openqa.selenium.firefox.FirefoxDriver.toExecutor(FirefoxDriver.java:207)
	at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:108)
	at org.openqa.selenium.firefox.FirefoxDriver.<init>(FirefoxDriver.java:104)
(略)

何か、「firefox用ドライバはjarに含まれているよ」的な指示をどこかに入れれば実はexeは不要なのかも知れない。


それにしても、こういうのばかりは、何かPythonなりRubyなりPerlなりのスクリプト言語の方が向いている気がする…。ただどれも不得手というかRubyに至っては起動方法すら知らぬのでとりあえずJavaでやるが。Javaなら一応文法は分かるからな。あとスクリプト言語はOS領域にライブラリを入れる事が多いので意外に導入へのハードルが高い。その点Javaはクラスパスで個別に管理できて意外に便利。

このエントリーをはてなブックマークに追加 mixiチェック

↑このページのトップヘ