【Selenium】 【Node.js】独自なwait()条件を作る
環境 Ubuntu 16.04 Selenium Standalone Server 3.0.1
- 普通は
webdriver.until.*
を条件に使う事が多いが、普通に独自の値や条件判定で設定する事もできる。
以下のように、webdriver.Condition
のインスタンスを返すようにすればいい。
ConditionインスタンスはメッセージとManagePromiseを引数にとる。
selenium/promise.js at master · SeleniumHQ/selenium · GitHub
const webdriver = require('selenium-webdriver'); const promise = require('selenium-webdriver/lib/promise').Promise; const driver = new webdriver.Builder() // オプション省略 let cond = function(val) { return new webdriver.Condition( "something message.", /** * @return {!ManagedPromise<T>} */ function(driver){ return promise.resolve(val); } ); } driver.wait(cond(true), 60000);
- ちなみに
document.readyState == 'complete'
を条件にするwait条件をつくりたかったのだが、webdriver.get()
やwebdriver.click()
はデフォルト対応しているらしい。 そしてajaxには無用・・・orz - 更にちなみに、一応以下のような感じ。テスト実施しているブラウザで、
document.*
みたいなのを使いたいときには参考になるかも。
let cond = new webdriver.Condition( "something message.", function(driver){ return driver.executeScript('return document.readyState').then(r => { return r == 'complete'; }) } );
【Selenium】 エラーがでたらまずdriverを更新する
環境 Ubuntu 16.04 Selenium Standalone Server 3.0.1
$ mocha test.js // 略 WebDriverError: unknown error: Runtime.executionContextCreated has invalid 'context': {"auxData":{"frameId":"16896.1","isDefault":true},"id":1,"name":"","origin":"://" } // stack trace
みたいのが延々と出て悩む。
$ node test2.js
みたいのは平気だったので、スクリプトの問題かと思って、また延々と悩む。
結局chromedriverを最新(2.27)に更新したら、サクッと直りました。 まずは悩む前にdriver更新しなさいという教訓。
【Scala】【ScalikeJDBC】 Config設定方法
環境 Scala 2.11.8 ScalikeJDBC 2.5.0
基本的にはこの内容 Configuration - ScalikeJDBC
scalikejdbc-conifg, application.confは設定方法によって必要
build.sbt
libraryDependencies ++= Seq( "org.scalikejdbc" %% "scalikejdbc" % "2.5.0", "org.scalikejdbc" %% "scalikejdbc-config" % "2.5.0", "mysql" % "mysql-connector-java" % "6.0.5", "ch.qos.logback" % "logback-classic" % "1.1.7" )
- src/main/resourcese/application.conf
development { db { sandbox { driver="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost:3306/test" user="sa" password="" } } }
/** * ConnectionPool config sample */ package main.scala.com.example import scalikejdbc._ import scalikejdbc.config._ import com.mysql.cj.jdbc.Driver object Db1{ /** * Pattern 1 */ def ex1 = { // Initialize ConnectionPool.singleton("jdbc:mysql://localhost:3306/test", "sa", "") implicit val session = AutoSession // Query val r = sql"""select * from a""".map(_.toMap).list.apply() println(r) } /** * Pattern 2 * necessary import scalikejdbc.config._ */ def ex2 = { // Initialize Class.forName("com.mysql.cj.jdbc.Driver") val settings = ConnectionPoolSettings( initialSize = 5, maxSize = 20, connectionTimeoutMillis = 3000L, validationQuery = "select 1") ConnectionPool.add('example, "jdbc:mysql://localhost:3306/test", "sa", "", settings) implicit val session = AutoSession // Query val r = NamedDB('example) readOnly { implicit session => sql"""select * from a""".map(_.toMap).list.apply() } println(r) } /** * Pattern 3 * necessary import scalikejdbc.config._ * necessary main/resources/application.conf */ def ex3 = { // Initialize DBsWithEnv("development").setup('sandbox) // addで別の設定を追加する事も可能 implicit val session = AutoSession // Query val r = NamedDB('sandbox) readOnly { implicit session => sql"""select * from a""".map(_.toMap).list.apply() } println(r) } }
【Scala】 sealedとパターンマッチ
環境 Scala 2.11.8
シールドクラス(トレイト)を継承したサブクラスは、すべて同一のソースファイルに定義される。
そしてシールドクラスをパターンマッチに使用されると、match式の網羅性をコンパイラがチェックできる。
sealedなし
このときはcaseのパターンが全て網羅されなくてもエラーは出ない。
が当然、網羅されていないパターンを投げると実行時エラーになる
trait Msg case class TxtMsg() extends Msg case class ObjMsg() extends Msg case class ErrMsg() extends Msg object Msg { def message(m: Msg): Unit = m match { case TxtMsg() => println("Text") } }
$ scalac Msg.scala $ # エラーは出ない
scala> :load Msg.scala Loading test.scala... defined trait Msg defined class TxtMsg defined class ObjMsg defined class ErrMsg defined object Msg scala> Msg.message(ErrMsg()) scala.MatchError: ErrMsg() (of class ErrMsg) at Msg$.message(<console>:16) ... 33 elided
sealedあり
こうすると、コンパイルエラーになるので安全。
sealed trait Msg case class TxtMsg() extends Msg case class ObjMsg() extends Msg case class ErrMsg() extends Msg object Msg { def message(m: Msg): Unit = m match { case TxtMsg() => println("Text") case ObjMsg() => println("Text") // case ErrMsg() => println("Text") } }
$ scalac test.scala test.scala:8: warning: match may not be exhaustive. It would fail on the following input: ErrMsg() def message(m: Msg): Unit = m match { ^ one warning found
【Scala】 sbt, activatorのproxy設定
環境 Scala 2.11.8 CentOS7.0
sbtやactivatorを実行してmoduleをダウンロードしてくるときに、proxyで引っかかる時の対策。
内部で実行されるjavaコマンドがproxyで引っかかってるので、起動スクリプトを編集する手もあるが、以下の環境変数を設定する事で解決できる。
export JAVA_OPTS="$JAVA_OPTS -Dhttp.proxyHost=yourserver -Dhttp.proxyPort=8080 -Dhttp.proxyUser=username -Dhttp.proxyPassword=password"
これで実行可能になった。
~/.sbt/config/
に設定ファイルを作るとか、HTTP_PROXYを設定しておけばOKとか色々見かけるが、私の環境では上手く動作せず。
最終的にこの方法で無事動作した。
【参考】