Selenium Web Driver และ Java ไม่สามารถคลิกองค์ประกอบที่จุด (x, y) องค์ประกอบอื่น ๆ จะได้รับคลิก


92

ฉันใช้การรออย่างชัดเจนและฉันมีคำเตือน:

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

คุณใช้ Chrome เวอร์ชัน 61+ หรือไม่
demouser123

@ demouser123 ฉันใช้ Firefox 47.0.1 และ seleniumWebDriver 2.51.0
Maria

@Maria คุณได้รับข้อผิดพลาดในบรรทัดใด ขอบคุณ
DebanjanB

@DebanjanB ในบรรทัด: driver.findElement (By.id ("navigationPageButton")) คลิก ();
Maria

ข้อผิดพลาดนั้นหมายความว่ามีองค์ประกอบอื่นซ้อนทับองค์ประกอบเป้าหมาย (การวางซ้อนแบบคงที่ / แบบสัมบูรณ์) หรือดัชนี z ต่ำเกินไป ซึ่งอาจเกิดจากเอฟเฟกต์โฮเวอร์โดยใช้การเปลี่ยน (ช้ากว่าการหมดเวลาขั้นต่ำในกรณีนี้คือ 393 มิลลิวินาที) คุณควรรอ#navigationPageButtonให้มองเห็นได้ (หรือคลิกได้โดยใช้elementToBeClickable()สำหรับองค์ประกอบนั้นด้วย) หรือตรวจสอบว่าตรงตามเงื่อนไขทั้งหมดหรือไม่เพื่อให้ปุ่มสามารถคลิกได้
ลองจับในที่สุด

คำตอบ:


194

WebDriverException: องค์ประกอบไม่สามารถคลิกได้ที่จุด (x, y)

นี้เป็นปกติorg.openqa.selenium.WebDriverExceptionซึ่งทอดตัวjava.lang.RuntimeException

ฟิลด์ของข้อยกเว้นนี้ ได้แก่ :

  • 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

เกี่ยวกับกรณีการใช้งานของคุณข้อผิดพลาดจะบอกทุกอย่าง:

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

มันเป็นที่ชัดเจนจากการป้องกันรหัสของคุณที่คุณได้กำหนดwaitเป็นWebDriverWait wait = new WebDriverWait(driver, 10);แต่คุณจะเรียกclick()วิธีการในองค์ประกอบก่อนที่จะเข้ามาเล่นในขณะที่ExplicitWaituntil(ExpectedConditions.elementToBeClickable)

วิธีการแก้

ข้อผิดพลาดElement is not clickable at point (x, y)อาจเกิดขึ้นจากปัจจัยต่างๆ คุณสามารถจัดการได้โดยทำตามขั้นตอนต่อไปนี้:

1. องค์ประกอบไม่ได้รับการคลิกเนื่องจากมีการเรียก JavaScript หรือ AJAX

ลองใช้ActionsClass:

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

2. องค์ประกอบไม่ได้รับการคลิกเนื่องจากไม่ได้อยู่ในวิวพอร์ต

พยายามใช้JavascriptExecutorเพื่อนำองค์ประกอบภายในวิวพอร์ต:

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

3. หน้านี้กำลังได้รับการรีเฟรชก่อนที่องค์ประกอบจะสามารถคลิกได้

ในกรณีนี้ทำให้เกิดExplicitWaitเช่นWebDriverWaitตามที่กล่าวไว้ในจุดที่ 4

4. องค์ประกอบมีอยู่ใน DOM แต่ไม่สามารถคลิกได้

ในกรณีนี้ทำให้เกิดExplicitWaitโดย ExpectedConditionsตั้งค่าเป็นเพื่อelementToBeClickableให้องค์ประกอบสามารถคลิกได้:

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

5. องค์ประกอบมีอยู่ แต่มีการวางซ้อนชั่วคราว

ในกรณีนี้ให้ชักจูง ExplicitWaitด้วยการ ExpectedConditionsตั้งค่าเป็นเพื่อinvisibilityOfElementLocatedให้โอเวอร์เลย์มองไม่เห็น

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

1
ถึง # 6 / # 2 ข้างต้น: ขณะนี้เมธอด. executeScript สามารถเข้าถึงได้จากโปรแกรมควบคุมเว็บเองแทนที่จะเป็น JavascriptExecutor ขอบคุณสำหรับคำตอบที่เขียนดี!
Tabrock

6
คุณได้ครอบคลุมความเป็นไปได้มากมายซึ่งมีเพียง 5 และ 6 เท่านั้นที่เป็นวิธีที่ถูกต้องในการจัดการข้อผิดพลาดดังกล่าว สี่ข้อแรกแสดงข้อผิดพลาดที่แตกต่างกันซึ่งโซลูชันที่คุณให้ไว้ใช้ไม่ได้ สำหรับตัวอย่างจุดที่ 3 เป็นปัญหาองค์ประกอบเก่าที่ใช้งานไม่ได้แม้ว่าคุณจะรอนานแค่ไหนด้วยเมธอด elementToBeClickble ที่จะต้องมีการจัดการที่แตกต่างกัน
Rajagopalan

6 ไม่ถูกต้องจริงๆแฮ็คเพื่อแก้ไขปัญหา 5 จะถูกต้องหากใช้เงื่อนไขที่คาดว่าจะถูกต้อง 4 ดูเหมือนคำตอบเดียวที่ถูกต้อง
Ardesco

1
สิ่งสำคัญที่ควรทราบคือเมื่อเราเลียนแบบการกระทำของผู้ใช้อาจเป็นเรื่องที่ไม่พึงปรารถนาอย่างยิ่งที่จะใช้จาวาสคริปต์เพื่อคลิกที่องค์ประกอบที่ไม่สามารถคลิกได้เลย (# 6) ผู้ใช้ปลายทางจะไม่ทำเช่นนั้นพวกเขาเพียงแค่เลื่อนไปที่องค์ประกอบเพื่อนำเข้าสู่วิวพอร์ตหรือปิดการวางซ้อนใด ๆ (หากหน้าอนุญาต) เพื่อโต้ตอบกับมัน
p_champ

18

ในกรณีที่คุณจำเป็นต้องใช้กับ Javascript

เราสามารถใช้อาร์กิวเมนต์ [0] .click () เพื่อจำลองการคลิก

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

ได้ผล! ฉันนึกไม่ออกว่ามันทำงานอย่างไร แต่มิฉะนั้นจะคลิกที่เลเยอร์ซ้อนทับ (การรอการปิดซ้อนทับโดย 'invisibilityOfElementLocated' จะใช้เวลาประมาณ 30 วินาที)
Fisk

คุณช่วยเขียนคำอธิบายแบบเต็มได้ไหมเนื่องจากฉันเขียนเป็น java และมันไม่ใช่สงครามที่คุ้นเคยคุณช่วยระบุขั้นตอนทั้งหมดได้ไหม
Bastian

4

ฉันพบข้อผิดพลาดนี้ขณะพยายามคลิกองค์ประกอบบางอย่าง (หรือการวางซ้อนฉันไม่สนใจ) และคำตอบอื่น ๆ ไม่ได้ผลสำหรับฉัน ฉันแก้ไขโดยใช้elementFromPointDOM 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

คุณสามารถลอง

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

มันไม่ได้ช่วยฉัน
Maria

ใช่: org.openqa.selenium.WebDriverException: องค์ประกอบไม่สามารถคลิกได้ที่จุด (36, 72) องค์ประกอบอื่น ๆ จะได้รับคลิก: <div tabindex = "0" class = "waiter-ui-lock"> </div> ระยะเวลาของคำสั่งหรือหมดเวลา: 70 มิลลิวินาที
Maria

1
ลองทำดังต่อไปนี้WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

มันไม่ช่วยด้วย ฉันมีสอง Exception และ AssertionError หนึ่งข้อและข้อผิดพลาดถัดไป "Element is not clickable at point"
Maria

1
ถ้าฉันใช้ Thread.Sleep ก็ทำงานทั้งหมด แต่ฉันใช้ Wait all ล้มเหลว
Maria

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

หมายเหตุ:ฉันใช้Facebook php webdriver


0

ทางออกที่ดีที่สุดคือการแทนที่ฟังก์ชันการคลิก:

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

ใน C # ฉันมีปัญหาในการตรวจสอบRadioButtonและสิ่งนี้ใช้ได้ผลสำหรับฉัน:

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

0

สามารถลองใช้รหัสด้านล่าง

 WebDriverWait wait = new WebDriverWait(driver, 30);

ผ่านองค์ประกอบอื่น ๆ จะได้รับคลิก :<a class="navbar-brand" href="#"></a>

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

ส่งรหัสปุ่มที่คลิกได้ตามที่แสดงด้านล่าง

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }

0

หากองค์ประกอบไม่สามารถคลิกได้และปัญหาการซ้อนทับกำลังเกิดขึ้นเราใช้อาร์กิวเมนต์ [0] .click ()

WebElement ele = driver.findElement (By.xpath ("// div [@ class = 'input-group-btn'] / input")); JavascriptExecutor Executor = ไดรเวอร์ (JavascriptExecutor); executor.executeScript ("อาร์กิวเมนต์ [0] .click ();", ele);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.