首页 文章

Selenium Web驱动程序和Java . 元素在点(x,y)处不可点击 . 其他元素将收到点击

提问于
浏览
33

我使用了明确的等待,我有警告:

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);
}

5 回答

  • 1

    你可以试试

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

    我试图点击一些元素(或它的叠加层时遇到了这个错误,我没有为我工作 . 我通过使用 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()
    

    我也有过元素移动的情况,例如因为页面上方的元素正在进行动画展开或折叠 . 在这种情况下,这个预期条件课程有所帮助 . 你给它动画的元素,而不是你想要点击的元素 . 此版本仅适用于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
    
  • 2

    将页面滚动到异常中提到的附近点对我来说是个窍门 . 以下是代码段:

    $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);");
    

    NOTE: 我用Facebook php webdriver

  • 88

    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
    

    从代码块可以清楚地看出,您已将 wait 定义为 WebDriverWait wait = new WebDriverWait(driver, 10); ,但是在 ExplicitWait 发挥作用之前,您正在调用元素上的 click() 方法,如 until(ExpectedConditions.elementToBeClickable) .

    解决方案

    错误 Element is not clickable at point (x, y) 可能来自不同的因素 . 您可以通过以下任一过程解决它们:

    1. Element not getting clicked due to JavaScript or AJAX calls present

    尝试使用 Actions 类:

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

    2. Element not getting clicked as it is not within Viewport

    尝试使用 JavascriptExecutor 将元素放在视口中:

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

    3. The page is getting refreshed before the element gets clickable.

    在这种情况下,如第4点所述,诱导 ExplicitWaitWebDriverWait .

    4. Element is present in the DOM but not clickable.

    在这种情况下,将 ExplicitWaitExpectedConditions 设置为 elementToBeClickable ,以便可点击元素:

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

    5. Element is present but having temporary Overlay.

    在这种情况下,将 ExplicitWaitExpectedConditions 设置为 invisibilityOfElementLocated ,以使Overlay不可见 .

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

    6. Element is present but having permanent Overlay.

    使用 JavascriptExecutor 直接在元素上发送单击 .

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

    如果您需要使用Javascript

    我们可以使用参数[0] .click()来模拟点击操作 .

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

相关问题