Trình điều khiển Web Selenium & Java. Phần tử không thể nhấp được tại điểm (x, y). Phần tử khác sẽ nhận được nhấp chuột


91

Tôi đã sử dụng các lượt đợi rõ ràng và tôi có cảnh báo:

org.openqa.selenium.WebDriverException: Phần tử không thể nhấp được tại điểm (36, 72). Phần tử khác sẽ nhận được nhấp chuột: ... Thời lượng lệnh hoặc thời gian chờ: 393 mili giây

Nếu tôi sử dụng, Thread.sleep(2000)tôi không nhận được bất kỳ cảnh báo nào.

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

Bạn có đang sử dụng Chrome phiên bản 61+ không?
demouser123

@ demouser123 Tôi đang sử dụng Firefox 47.0.1 và seleniumWebDriver 2.51.0
Maria

@Maria Bạn đang gặp lỗi ở dòng nào? Cảm ơn
DebanjanB

@DebanjanB Trong dòng: driver.findElement (By.id ("navigationPageButton")). Click ();
Maria

Lỗi đó có nghĩa là, có một phần tử khác đang phủ lên phần tử mục tiêu (lớp phủ có vị trí cố định / tuyệt đối) hoặc chỉ số z quá thấp. Điều này có thể do hiệu ứng di chuột sử dụng chuyển tiếp (chậm hơn thời gian chờ tối thiểu, trong trường hợp này là 393 mili giây). bạn nên đợi #navigationPageButtonhiển thị (hoặc có thể nhấp được khi sử dụng elementToBeClickable()cho phần tử đó) hoặc kiểm tra xem tất cả các điều kiện tiên quyết có được đáp ứng hay không để nút có thể nhấp được.
try-catch-

Câu trả lời:


192

WebDriverException: Phần tử không thể nhấp được tại điểm (x, y)

Đây là một org.openqa.selenium.WebDriverException điển hình mở rộng java.lang.RuntimeException .

Các trường của ngoại lệ này là:

  • BASE_SUPPORT_URL :protected static final java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFO :public static final java.lang.String DRIVER_INFO
  • SESSION_ID :public static final java.lang.String SESSION_ID

Về usecase cá nhân của bạn, lỗi nói lên tất cả:

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

Rõ ràng từ khối mã của bạn rằng bạn đã xác định waitas WebDriverWait wait = new WebDriverWait(driver, 10);nhưng bạn đang gọi click()phương thức trên phần tử trước khi nó hoạt động ExplicitWaitnhư trong until(ExpectedConditions.elementToBeClickable).

Giải pháp

Lỗi Element is not clickable at point (x, y)có thể phát sinh từ các yếu tố khác nhau. Bạn có thể giải quyết chúng bằng một trong các quy trình sau:

1. Phần tử không được nhấp do có các lệnh gọi JavaScript hoặc AJAX

Cố gắng sử dụng ActionsClass:

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

2. Phần tử không được nhấp vì nó không nằm trong Viewport

Cố gắng sử dụng JavascriptExecutorđể đưa phần tử vào trong Viewport:

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

3. Trang đang được làm mới trước khi phần tử có thể nhấp được.

Trong trường hợp này, tạo ra ExplicitWait tức là WebDriverWait như đã đề cập ở điểm 4.

4. Phần tử hiện diện trong DOM nhưng không thể nhấp được.

Trong trường hợp này gây ExplicitWait với ExpectedConditionscác thiết lập để elementToBeClickablecho các phần tử được nhấp:

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

5. Phần tử hiện diện nhưng có Lớp phủ tạm thời.

Trong trường hợp này, kích hoạt ExplicitWaitvới ExpectedConditionsthiết lập để invisibilityOfElementLocatedLớp phủ ẩn.

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

6. Phần tử hiện diện nhưng có Lớp phủ vĩnh viễn.

Sử dụng JavascriptExecutorđể gửi nhấp chuột trực tiếp vào phần tử.

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

1
Đến # 6 / # 2 ở trên: Phương thức .ExecuteScript hiện có thể truy cập được từ chính trình điều khiển web thay vì JavascriptExecutor. Cảm ơn cho câu trả lời bằng văn bản!
Tabrock

6
Bạn đã đề cập đến nhiều khả năng, trong đó chỉ có 5 và 6 là cách chính xác để xử lý lỗi đã đề cập. Bốn lỗi đầu tiên gây ra lỗi khác nhau mà giải pháp bạn đưa ra sẽ không hoạt động. Đối với một ví dụ, điểm số 3 thực sự là một vấn đề phần tử cũ sẽ không hoạt động mặc dù bạn đợi bao lâu với phương thức elementToBeClickble. Điều đó phải được xử lý theo cách khác.
Rajagopalan

6 là không thực sự chính xác nó; một hack để giải quyết vấn đề, 5 sẽ đúng nếu điều kiện mong đợi chính xác đang được sử dụng. 4 có vẻ là câu trả lời đúng duy nhất.
Ardesco

1
Một điều quan trọng cần lưu ý là, khi chúng tôi đang mô phỏng hành động của người dùng, có thể rất không mong muốn sử dụng javascript để nhấp vào phần tử không thể nhấp được (# 6). Người dùng cuối sẽ không bao giờ làm điều đó, họ sẽ chỉ cuộn đến phần tử để đưa nó vào chế độ xem hoặc loại bỏ bất kỳ lớp phủ nào (nếu được trang cho phép) để tương tác với nó.
p_champ

17

Trong trường hợp bạn cần sử dụng nó với Javascript

Chúng ta có thể sử dụng đối số [0] .click () để mô phỏng thao tác nhấp chuột.

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

Làm! Tôi không thể tưởng tượng cách nó hoạt động, nhưng nếu không thì nó sẽ nhấp vào lớp overlay (chờ lớp overlay đóng bởi 'invisibilityOfElementLocated' mất khoảng 30 giây).
Fisk

Bạn có thể vui lòng viết giải thích đầy đủ vì tôi viết bằng java và nó không phải là chiến tranh quen thuộc, bạn có thể vui lòng cung cấp đầy đủ luồng không?
Bastian

4

Tôi đã gặp phải lỗi này khi cố gắng nhấp vào một số phần tử (hoặc lớp phủ của nó, tôi không quan tâm) và các câu trả lời khác không phù hợp với tôi. Tôi đã sửa nó bằng cách sử dụng elementFromPointAPI DOM để tìm phần tử mà Selenium muốn tôi nhấp vào để thay thế:

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()

Tôi cũng đã gặp các tình huống trong đó một phần tử đang di chuyển , chẳng hạn như vì một phần tử phía trên nó trên trang đang thực hiện động tác mở rộng hoặc thu gọn. Trong trường hợp đó, lớp Điều kiện mong đợi này đã giúp ích. Bạn cung cấp cho nó các yếu tố hoạt hình , không phải những yếu tố bạn muốn nhấp vào. Phiên bản này chỉ hoạt động cho hoạt ảnh 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

Bạn co thể thử

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

Nó không giúp tôi.
Maria

Có: org.openqa.selenium.WebDriverException: Phần tử không thể nhấp được tại điểm (36, 72). Phần tử khác sẽ nhận được nhấp chuột: <div tabindex = "0" class = "waiter-ui-lock"> </div> Thời lượng lệnh hoặc thời gian chờ: 70 mili giây
Maria

1
hãy thử như sauWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

Nó cũng không giúp được gì. Tôi có hai Exception và một AssertionError và tiếp theo là một số lỗi "Phần tử không thể nhấp được tại điểm"
Maria

1
Nếu tôi sử dụng Thread.Sleep thì tất cả đều hoạt động. Nhưng tôi sử dụng Chờ tất cả không thành công.
Maria

2

Cuộn trang đến từng điểm được đề cập trong ngoại lệ đã thực hiện một mẹo nhỏ đối với tôi. Dưới đây là đoạn mã:

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

LƯU Ý: Tôi sử dụng Facebook php webdriver


0

Giải pháp tốt nhất là ghi đè chức năng nhấp chuột:

public void _click(WebElement element){
    boolean flag = false;
    while(true) {
        try{
            element.click();
            flag=true;
        }
        catch (Exception e){
            flag = false;
        }
        if(flag)
        {
            try{
                element.click();
            }
            catch (Exception e){
                System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage());
            }
            break;
        }
    }
}

0

Trong C #, tôi gặp sự cố với việc kiểm tra RadioButtonvà điều này đã hiệu quả với tôi:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);

0

Có thể thử với mã dưới đây

 WebDriverWait wait = new WebDriverWait(driver, 30);

Vượt qua phần tử khác sẽ nhận được nhấp chuột :<a class="navbar-brand" href="#"></a>

    boolean invisiable = wait.until(ExpectedConditions
            .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));

Chuyển id nút có thể nhấp như hình dưới đây

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.