Open6

JavaScript Tip

BlueSilverCatBlueSilverCat

何をやっているか理解できなかった。
利点はあるのだろうか。

a = [];
a[a.length] = 1;
a[a.length] = 2;
console.log(a, a.length)
b = [];
b.push(1);
b.push(2);
console.log(b, b.length)
BlueSilverCatBlueSilverCat

Selenium

グローバル関数を無効化する

以下のような関数があった場合、

function f() {
  console.log("f");
}

以下のようにする

window.f = ()=>{};

send_keys()を置き換える

  • 速度が速くなる。
  • 状態に左右されない。(欠点でもあるけど)
  • clear()は必要ない。
Input = """\
arguments[0].value = arguments[1];
const keydownEvent = new KeyboardEvent('keydown', {keyCode: 13, key: 'Enter'});
arguments[0].dispatchEvent(keydownEvent);
const keyupEvent = new KeyboardEvent('keyup', {keyCode: 13, key: 'Enter'});
arguments[0].dispatchEvent(keyupEvent);
"""

element = driver.find_element(...)
driver.execute_script(Input, element, "...")
BlueSilverCatBlueSilverCat

EventListenerをすべて削除する

碌にテストしていないので注意。
削除されることはされる。
ただし、副作用は当然存在する。

<div id="div1">
  hoge
</div>
element = document.getElementById("div1");
element.addEventListener("click", ()=>{console.log("click")})
clone = element.cloneNode(true);
clone.textContent = "hage";
element.replaceWith(clone);
BlueSilverCatBlueSilverCat

XPath

function getElementByXpath(path) {
  return document.evaluate(
    path,
    document,
    null,
    XPathResult.FIRST_ORDERED_NODE_TYPE,
    null
  ).singleNodeValue;
}

function getElementsByXpath(path) {
  result = document.evaluate(
    path,
    document,
    null,
    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,
    null
  );
  elements = [];
  for (let i = 0; i < result.snapshotLength; ++i) {
    elements.push(result.snapshotItem(i));
  }
  return elements
}
BlueSilverCatBlueSilverCat

表示されているか判定

もっとうまいやり方があるけど

function isDisplayed(element, limit = null) {
  while (element.nodeType === 1) {
    if (limit !== null && element === limit.parentNode) {
      return true;
    }
    console.log(element.tagName.toLowerCase());

    style = window.getComputedStyle(element);
    if (
      style.getPropertyValue("display") === "none" ||
      style.getPropertyValue("visibility") === "hidden"
    ) {
      return false;
    }
    element = element.parentNode;
  }
  return true;
}