Selenium Web Sürücüsü ve Java. Öğe, (x, y) noktasında tıklanabilir değil. Diğer öğe tıklamayı alacak


91

Açık beklemeler kullandım ve şu uyarıyı alıyorum:

org.openqa.selenium.WebDriverException: Eleman (36, 72) noktasında tıklanamaz. Diğer öğe tıklama alır: ... Komut süresi veya zaman aşımı: 393 milisaniye

Ben kullanırsanız Thread.sleep(2000)ben herhangi bir uyarı almazsınız.

@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+ sürümünü mü kullanıyorsunuz?
— demouser123

@ demouser123 Firefox 47.0.1 ve seleniumWebDriver 2.51.0 kullanıyorum
— Maria

@Maria Hangi satırda hata alıyorsunuz? Teşekkürler
— DebanjanB

@DebanjanB Satır içi: driver.findElement (By.id ("navigationPageButton")). Tıklayın ();
— Maria

Bu hata, hedef öğeyi (sabit / mutlak konumlandırılmış yer paylaşımı) kaplayan başka bir öğe olduğu veya z-endeksinin çok düşük olduğu anlamına gelir. Bu, geçişleri kullanan vurgulu efektlerden kaynaklanıyor olabilir (minimum zaman aşımından daha yavaş, bu durumda 393 ms). #navigationPageButtonGörünür hale gelmeyi (veya elementToBeClickable()o öğe için de tıklanabilir olmayı) beklemelisiniz veya düğmenin tıklanabilir olması için tüm ön koşulların karşılanıp karşılanmadığını kontrol etmelisiniz.
— dene-yakala-nihayet

Yanıtlar:


192

WebDriverException: Öğe (x, y) noktasında tıklanabilir değil

Bu, java.lang.RuntimeException'ı genişleten tipik bir org.openqa.selenium.WebDriverException'dır .

Bu istisnanın alanları şunlardır:

  • 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

Kişisel kullanım durumunuz hakkında, hata her şeyi anlatır:

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

Kod bloğunuzdan, waitolarak tanımladığınız WebDriverWait wait = new WebDriverWait(driver, 10);ancak olduğu gibi devreye click()girmeden önce öğedeki yöntemi çağırdığınız açıktır .ExplicitWaituntil(ExpectedConditions.elementToBeClickable)

Çözüm

Hata Element is not clickable at point (x, y), farklı faktörlerden kaynaklanabilir. Bunları aşağıdaki prosedürlerden biriyle ele alabilirsiniz:

1. Mevcut JavaScript veya AJAX çağrıları nedeniyle öğe tıklanmıyor

ActionsSınıfı kullanmayı deneyin :

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

2. Öğe, Görüntü Alanı içinde olmadığından tıklanmıyor

JavascriptExecutorÖğeyi Görüntü Alanı'na getirmek için kullanmayı deneyin :

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

3. Öğe tıklanabilir hale gelmeden önce sayfa yenileniyor.

Bu durumda 4. maddede belirtildiği gibi ExplicitWait yani WebDriverWait'i başlatın .

4. Öğe DOM'da mevcut ancak tıklanabilir değil.

Bu durumda , öğenin tıklanabilir olması için ExplicitWait'i olarak ExpectedConditionsayarlayarak indükleyin elementToBeClickable:

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

5. Öğe mevcuttur, ancak geçici Bindirmeye sahiptir.

Bu durumda, Yerleşimin görünmez olması için ayarı olarak teşvik ExplicitWaitedin .ExpectedConditionsinvisibilityOfElementLocated

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

6. Öğe mevcuttur, ancak kalıcı Yerleşime sahiptir.

Tıklamayı JavascriptExecutordoğrudan öğeye göndermek için kullanın .

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

1
Yukarıdaki # 6 / # 2'ye: .ExecuteScript yöntemine artık JavascriptExecutor yerine web sürücüsünden erişilebilir. İyi yazılmış cevap için teşekkürler!
— Tabrock

6
Bahsedilen hatayı ele almak için yalnızca 5 ve 6'nın doğru yol olduğu birçok olasılığı ele aldınız. İlk dördü, verdiğiniz çözümün işe yaramayacağı farklı bir hata atar. Örnek olarak 3 numaralı nokta elementToBeClickble metodu ile ne kadar bekleseniz bile işe yaramayacak eski bir element problemidir. Bunun farklı şekilde ele alınması gerekiyor.
— Rajagopalan

6 gerçekten doğru değil; soruna geçici bir çözüm bulmak için bir hack, beklenen doğru koşul kullanılıyorsa 5 doğru olacaktır. 4 tek doğru cevap gibi görünüyor.
— Ardesco

1
Unutulmaması gereken önemli bir nokta, kullanıcının eylemlerini taklit ettiğimizde, tıklanamayan öğeye tıklamak için javascript kullanmak çok istenmeyen olabilir (# 6). Son kullanıcı bunu asla yapmaz, sadece onu görüntü alanına getirmek için öğeye kaydırır veya onunla etkileşim kurmak için herhangi bir kaplamayı (sayfa tarafından izin veriliyorsa) kaldırır.
— p_champ

17

Javascript ile kullanmanız gerekmesi durumunda

Tıklama işlemini simüle etmek için [0] .click () argümanlarını kullanabiliriz.

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

İşler! Nasıl çalıştığını hayal edemiyorum, ancak aksi halde overlay katmanına tıklar ('invisibilityOfElementLocated' tarafından kaplamanın kapanmasını beklemek yaklaşık 30 saniye sürer).
— Fisk

Ben javada yazdığım ve bu savaş aşina olmadığım için lütfen tam açıklamayı yazabilir misiniz, lütfen tam akış sağlar mısınız?
— Bastian

4

Bir öğeyi (veya kaplamasını, umursamadım) tıklamaya çalışırken bu hatayla karşılaştım ve diğer yanıtlar benim için işe yaramadı. Bunu elementFromPoint, Selenium'un tıklamamı istediği öğeyi bulmak için DOM API'yi kullanarak düzelttim :

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

Ayrıca, bir öğenin hareket ettiği durumlar da oldu , örneğin, sayfanın üstündeki bir öğenin animasyonlu bir genişletme veya daraltma yaptığı için. Bu durumda, bu Beklenen Koşul sınıfı yardımcı oldu. Ona , tıklamak istediklerinizi değil, canlandırılan öğeleri veriyorsunuz . Bu sürüm yalnızca jQuery animasyonları için çalışır.

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

Deneyebilirsin

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

Bana yardımcı olmuyor.
— Maria

Evet: org.openqa.selenium.WebDriverException: Öğe (36, 72) noktasında tıklanamaz. Diğer öğe tıklamayı alır: <div tabindex = "0" class = "waiter-ui-lock"> </div> Komut süresi veya zaman aşımı: 70 milisaniye
— Maria

1
aşağıdakileri deneyinWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
— fg78nc

O da yardımcı olmuyor. İki Exception ve bir AssertionError var ve sonraki bir hata "Öğe noktada tıklanamıyor"
— Maria

1
Thread.Sleep kullanırsam hepsi çalışır. Ama Bekle kullanıyorum, hepsi başarısız.
— Maria

2

Sayfayı istisnada belirtilen yakın noktaya kaydırmak benim için hile yaptı. Kod parçacığı aşağıdadır:

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

NOT: Kullandığım Facebook'un php webdriver


0

En iyi çözüm, tıklama işlevini geçersiz kılmaktır:

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 # 'da kontrol etme konusunda sorun yaşadım RadioButtonve bu benim için çalıştı:

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

0

Aşağıdaki kodla deneyebilir

 WebDriverWait wait = new WebDriverWait(driver, 30);

Diğer öğeyi geçmek, tıklamayı alır :<a class="navbar-brand" href="#"></a>

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

Tıklanabilir düğme kimliğini aşağıda gösterildiği gibi geçirin

    if (invisiable) {
        WebElement ele = driver.findElement(By.xpath("//div[@id='button']");
        ele.click();
    }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.