web-dev-qa-db-ja.com

WebDriverJSで要素がクリック可能になるのを待つにはどうすればよいですか?

WebDriverJS でWebElementがクリック可能になるのを待つ方法を知っている人はいますか?要素が「表示」されるのを待つ方法はすでに知っていますが、「クリック可能」である必要があります。 予想される条件 in Pythonバインディング。WebdriverJsAPIで類似したものを見つけることができませんでした。

11
cSn

PythonのSelenium.webdriver.support.expected_conditions.element_to_be_clickableに相当する条件はないようです。ただし、その状態のソースを見ると、2つのチェックが行われていることがわかります。

  1. 要素が表示されていること。

  2. 有効になっていること。

したがって、両方の条件が真になるのを待つことができます。次のコードは、それがどのように行われるかを示しています。最初に要素を非表示にして無効にし、タイムアウトを設定して要素を表示して有効にし、2つの条件が発生するのを待ちます。

var webdriver = require('Selenium-webdriver');

var driver = new webdriver.Builder().
   withCapabilities(webdriver.Capabilities.chrome()).
   build();

driver.get('http://www.google.com');

// This script allows testing the wait. We make the element invisible
// and disable it and then set timeouts to make it visible and enabled.
driver.executeScript("\
var q = document.getElementsByName('q')[0];\
q.style.display = 'none';\
q.disabled = true;\
setTimeout(function () {\
    q.style.display = '';\
}, 2000);\
setTimeout(function () {\
    q.disabled = false;\
}, 3000);\
");
driver.findElement(webdriver.By.name('q')).then(function (element) {
    driver.wait(function () {
        return element.isDisplayed().then(function (displayed) {
            if (!displayed)
                return false;

            return element.isEnabled();
        });
    });
    element.sendKeys('webdriver');
});
driver.findElement(webdriver.By.name('btnG')).click();
driver.wait(function() {
 return driver.getTitle().then(function(title) {
   return title === 'webdriver - Google Search';
 });
}, 1000);

driver.quit();

私たちがpromiseを使用しているため、コードは少し奇妙に見えるかもしれません。その約束は本質的に奇妙なものではありませんが、Pythonでの作業に慣れると時間がかかります。

8
Louis

オブジェクトが利用可能になったらクリックすることを気にしない場合**、次のようなことができます。

function clickWhenClickable(locator, timeout){
  driver.wait(function(){
    return driver.findElement(locator).then(function(element){
      return element.click().then(function(){
        return true;
      }, function(err){
        return false;
      })
    }, function(err){
      return false;
    });
  }, timeout, 'Timeout waiting for ' + locator.value);    ;
}

**just要素がクリック可能かどうかを確認したい場合クリックせずにこのスニペットはあなたには適していません。その場合、webdriverjsはそれを行う手段を提供していないと思います。 (または少なくとも私はまだそれを見つけていません、洞察を歓迎します:))

2
Christian Adam

UNTILは、これにWebdriverjsで最も近いもののようです。

チェック: https://seleniumhq.github.io/Selenium/docs/api/javascript/module/Selenium-webdriver/lib/until.html

そこにはすでに定義された待機条件があります。どちらがクリック可能と見なされるべきかわかりません。

1
cSn