web-dev-qa-db-ja.com

Selenium WebdriverとJava。要素はポイント(x、y)でクリックできません。他の要素はクリックを受け取ります

私は明示的な待機を使用しましたが、警告があります:

org.openqa.Selenium.WebDriverException:要素はポイント(36、72)でクリックできません。他の要素はクリックを受け取ります:...コマンドの継続時間またはタイムアウト:393ミリ秒

Thread.sleep(2000)を使用した場合、警告は表示されません。

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    driver.findElement(By.id("navigationPageButton")).click();

    try {
       wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
    } catch (Exception e) {
        System.out.println("Oh");
    }
    driver.findElement(By.cssSelector(btnMenu)).click();
    Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}
51
Maria

WebDriverException:要素はポイント(x、y)でクリックできません

これは典型的な org.openqa.Selenium.WebDriverException であり、これはJava.lang.RuntimeExceptionを拡張します。

この例外のフィールドは次のとおりです。

  • BASE_SUPPORT_URLprotected static final Java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFOpublic static final Java.lang.String DRIVER_INFO
  • SESSION_IDpublic static final Java.lang.String SESSION_ID

個々のユースケースについて、エラーはそれをすべて伝えます:

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

waitWebDriverWait wait = new WebDriverWait(driver, 10);として定義したことはコードブロックから明らかですが、ExplicitWaitclick()のように作用する前に、要素に対してuntil(ExpectedConditions.elementToBeClickable)メソッドを呼び出しています。

解決

エラーElement is not clickable at point (x, y)は、さまざまな要因から発生する可能性があります。次のいずれかの手順でそれらに対処できます。

1。 JavaScriptまたはAJAX呼び出しが原因で要素がクリックされない

Actionsクラスを使用してみてください。

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2。要素が Viewport内にないためクリックされない

JavascriptExecutorを使用して、ビューポート内に要素を持ってくるようにしてください:

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3。要素がクリック可能になる前にページが更新されます。

この場合、ポイント4で述べたように、ExplicitWait、つまりWebDriverWaitを誘導します。

4。要素はDOMに存在しますが、クリック可能ではありません。

この場合、クリック可能にする要素に対してExpectedConditionselementToBeClickableに設定してExplicitWaitを誘導します。

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5。要素は存在しますが、一時的なオーバーレイがあります。

この場合、ExplicitWaitExpectedConditionsinvisibilityOfElementLocatedオーバーレイを非表示にします。

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6。要素は存在しますが、永続的なオーバーレイを持っています。

JavascriptExecutorを使用して、要素のクリックを直接送信します。

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
127
DebanjanB

Javascriptで使用する必要がある場合

Arguments [0] .click()を使用して、クリック操作をシミュレートできます。

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);
11
Rester Test

ある要素(またはそのオーバーレイ、私は気にしませんでした)をクリックしようとしたときにこのエラーに遭遇し、他の答えは私にとってはうまくいきませんでした。 elementFromPoint DOM APIを使用して修正し、代わりにSeleniumがクリックしてほしい要素を見つけました。

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
    "return document.elementFromPoint(arguments[0], arguments[1]);",
    loc['x'],
    loc['y'])
element_to_click.click()

また、要素がmovingであるという状況もありました。たとえば、ページ上でその上の要素がアニメーション化された展開または折りたたみを行っていたためです。その場合、このExpected Conditionクラスが役に立ちました。クリックする要素ではなく、アニメーション化される要素を指定します。このバージョンはjQueryアニメーションでのみ機能します。

class elements_not_to_be_animated(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            # :animated is an artificial jQuery selector for things that are
            # currently animated by jQuery.
            return driver.execute_script(
                'return !jQuery(arguments[0]).filter(":animated").length;',
                elements)
        except StaleElementReferenceException:
            return False
3
rescdsk

例外で言及されたポイントでページを近くまでスクロールすると、私にとってはうまくいきませんでした。以下はコードスニペットです。

$wd_Host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_Host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

注:私は Facebook php webdriver を使用します

2
Sudheesh.M.S

あなたが試すことができます

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
2
fg78nc