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.