सेलेनियम वेब ड्राइवर और जावा। तत्व बिंदु (x, y) पर क्लिक करने योग्य नहीं है। अन्य तत्व क्लिक प्राप्त करेंगे


91

मैंने स्पष्ट प्रतीक्षा का उपयोग किया है और मेरे पास चेतावनी है:

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 मैं फ़ायरफ़ॉक्स 47.0.1 और सेलेनियमवेबड्राइव 2.51.0 का उपयोग कर रहा हूँ
मारिया

@ मोरिया आपको किस लाइन पर त्रुटि हो रही है? धन्यवाद
DebanjanB

@DebanjanB लाइन में: driver.findElement (By.id ("नैविगेशनपेजबटन"))। क्लिक करें ();
मारिया

उस त्रुटि का मतलब है, लक्ष्य तत्व (निश्चित / निरपेक्ष तैनात ओवरले) ओवरलेइंग एक अन्य तत्व है या z-index बहुत कम है। यह संक्रमण के कारण होवर प्रभाव के कारण हो सकता है (इस समय 393ms में, न्यूनतम मध्यांतर की तुलना में धीमा)। आपको #navigationPageButtonदिखाई देने का इंतजार करना चाहिए (या elementToBeClickable()उस तत्व के लिए क्लिक करने योग्य भी) या यह जांचने के लिए कि क्या सभी पूर्व शर्त पूरी की जाती हैं ताकि बटन क्लिक करने योग्य हो।
कोशिश-कैच-अंततः

जवाबों:


192

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()उस तत्व को कॉल कर रहे हैं, जो ExplicitWaitआने के पहले तत्व पर चलता है until(ExpectedConditions.elementToBeClickable)

समाधान

त्रुटि Element is not clickable at point (x, y)विभिन्न कारकों से उत्पन्न हो सकती है। आप उन्हें निम्नलिखित प्रक्रियाओं में से किसी से भी संबोधित कर सकते हैं:

1. मौजूद जावास्क्रिप्ट या AJAX कॉल के कारण क्लिक नहीं किया गया तत्व

Actionsकक्षा का उपयोग करने का प्रयास करें :

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 को प्रेरित करें :ExpectedConditionselementToBeClickable

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

5. तत्व मौजूद है लेकिन अस्थायी ओवरले है।

इस मामले में, ओवरले के अदृश्य होने के लिए सेट के ExplicitWaitसाथ प्रेरित करें ।ExpectedConditionsinvisibilityOfElementLocated

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 के बजाय वेब ड्राइवर से ही पहुंच योग्य है। अच्छी तरह से लिखित उत्तर के लिए धन्यवाद!
टैक्रॉक

6
आपने कई संभावनाओं को कवर किया है जिसमें केवल 5 और 6 उल्लिखित त्रुटि को संभालने का सही तरीका है। पहला चार अलग-अलग त्रुटि करता है जिसके लिए आपने जो समाधान दिया है वह काम नहीं करेगा। एक उदाहरण बिंदु संख्या 3 के लिए वास्तव में एक बासी तत्व समस्या है जो तब तक काम नहीं करेगी, भले ही आप कितने समय तक प्रतीक्षा करें। जिसे अलग तरह से संभालना होगा।
राजगोपालन

6 वास्तव में इसे सही नहीं है; मुद्दे के आसपास काम करने के लिए हैक, 5 सही होगा यदि सही अपेक्षित स्थिति का उपयोग किया जा रहा था। 4 एकमात्र सही उत्तर की तरह दिखता है।
अर्सडेसो

1
ध्यान देने वाली एक महत्वपूर्ण बात यह है कि जब हम उपयोगकर्ता के कार्यों का अनुकरण कर रहे हैं, तो जावास्क्रिप्ट का उपयोग करने के लिए बहुत अवांछनीय हो सकता है कि उस तत्व पर क्लिक करें जिसे (# 6) पर क्लिक नहीं किया जा सकता है। अंतिम उपयोगकर्ता ऐसा कभी नहीं करेगा, वे इसे देखने के लिए तत्व में स्क्रॉल करेंगे या किसी भी ओवरले को खारिज कर देंगे (यदि पृष्ठ द्वारा अनुमति दी गई है) इसके साथ बातचीत करने के लिए।
p_champ

17

मामले में आपको इसे जावास्क्रिप्ट के साथ उपयोग करने की आवश्यकता है

हम क्लिक ऑपरेशन का अनुकरण करने के लिए तर्कों [0] .click () का उपयोग कर सकते हैं।

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

काम करता है! मैं इसके काम करने के तरीके की कल्पना नहीं कर सकता, लेकिन अन्यथा यह ओवरले लेयर पर क्लिक करता है ('इनविजिबिलिटी ऑफफ्लीमेंटलीकेटेड' द्वारा ओवरले क्लोजिंग की प्रतीक्षा में लगभग 30 सेकंड का समय लगता है।)।
फिक

क्या आप कृपया पूरा विवरण लिख सकते हैं क्योंकि मैं जावा में लिखता हूं और यह परिचित युद्ध नहीं है, क्या आप कृपया पूर्ण प्रवाह प्रदान कर सकते हैं?
बास्टियन

4

मैं कुछ तत्व (या इसके ओवरले, मुझे ध्यान नहीं था) पर क्लिक करने की कोशिश करते समय इस त्रुटि में भाग गया, और अन्य जवाब मेरे लिए काम नहीं किए। मैंने elementFromPointDOM API का उपयोग उस तत्व को खोजने के लिए किया, जिसे सेलेनियम चाहता था कि मैं इसके बजाय उस पर क्लिक करूँ:

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

यह मेरी मदद नहीं है।
मारिया

हां: org.openqa.selenium.WebDriverException: तत्व बिंदु (36, 72) पर क्लिक करने योग्य नहीं है। अन्य तत्व क्लिक प्राप्त करेंगे: <div tabindex = "0" class = "waiter-ui-lock"> </ div> कमांड अवधि या समयबाह्य: 70 मिलीसेकंड
मारिया

1
निम्नलिखित प्रयास करेंWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

यह भी मदद नहीं है। मेरे पास दो अपवाद और एक जोर है और अगली कुछ त्रुटि "तत्व बिंदु पर क्लिक करने योग्य नहीं है"
मारिया

1
अगर मैं Thread.Sleep का उपयोग कर रहा हूं तो सभी काम करेंगे। लेकिन मैं प्रतीक्षा का उपयोग कर रहा हूँ सभी विफल।
मारिया

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

ध्यान दें: मैं फेसबुक php वेबड्राइवर का उपयोग करता हूं


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();
    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.