"Öğe noktada tıklanabilir değil" hatası hata ayıklama


396

Bunu yalnızca Chrome'da görüyorum.

Hata iletisinin tamamı şöyle:

"org.openqa.selenium.WebDriverException: Öğe (411, 675) noktasında tıklatılamaz. Diğer öğe tıklamayı alır: ..."

'Tıklamayı alacak olan öğe', söz konusu öğenin üstündedir, üst kısmında değil üst üste değil, sayfada hareket etmiyor.

Bir mahsup eklemeyi denedim, ama bu da çalışmıyor. Öğe, kaydırma yapmaya gerek kalmadan görüntülenen pencerede bulunur.


2
Sayfanın yüklenmesini bekliyor musunuz? Belki sayfa yüklenirken başka bir öğe üst üste gelir?
Herokiller

55
Sadece gelenler için uzun öykü kısa - ELEMAN SAYFADA GÖRÜNMEZ VE ÖNCE TIKLANMAZ. GÖRÜNÜM penceresini EMITTING penceresine göre kaydırmanız GEREKİR.
Chris B. Behrens

67
@ ChrisB.Behrens Bu her zaman böyle değildir. Bu özel hata, bir eleman başka bir eleman tarafından kaplandığında da verilebilir. Postion sabit başka bir öğe olan bir düğmeye tıklamaya çalışırken bu istisna vardı.
Martin Cassidy

4
Sadece Chromedriver değil - Firefox ile aynı sorunu vardı. Yukarıdaki diğerleri tarafından önerildiği gibi, sayfanın tamamen yeniden yüklenmesini beklemek için bir gecikme uygulayarak sorunu çözdüm.
codervince

5
Bunun scrollTo yayan ya da beklemenin kesinlikle yanlış bir tavsiye olduğunu düşünüyorum. Selenyum tıklama algoritması şöyledir: 1. eleman pozisyonunu hesapla 2. scroll Bu pozisyona (yani bunu kendin vermene gerek yok) 3. Bu pozisyona tıkla (istisna, hangi elementin bunun üzerinde durduğunu kontrol eden son iddiadan gelir) gerçek tıklama etkinliği göndermeden hemen önceki konum) Önerilerim: 1. öğenin görünümünüzün içinde olup olmadığını kontrol edin. 2. öğenin başka herhangi bir şeyle (yapışkan menüler gibi) kaplı olup olmadığını kontrol edin, varsa bunları gizleyin veya yerleşik scrollTo öğesine güvenmeden tıklamadan önce manuel olarak kaydırın.
Vitalik Verhovodov

Yanıtlar:


325

Bunun nedeni aşağıdaki 3 türdür:

1.Öğe tıklanamaz.

Tıklatmak için Eylemler veya JavascriptExecutor kullanın .

İşlemlere göre:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

JavascriptExecutor tarafından:

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("scroll(250, 0)"); // if the element is on top.

jse.executeScript("scroll(0, 250)"); // if the element is on bottom.

veya

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Ardından öğeye tıklayın.

2. Sayfa, öğeyi tıklamadan önce yenileniyor.

Bunun için sayfayı birkaç saniye bekletin.

3. Öğe tıklanabilir ancak üstünde bir eğirme / bindirme var

Aşağıdaki kod, yer paylaşımı kaybolana kadar bekleyecektir

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Ardından öğeye tıklayın.


52
Üçüncü bir neden türü vardır, yani öğeniz bir div veya açıklığa sarılır. Sayfa tamamen yüklenebilir ve görünümün tamamen içine yerleştirilebilir, ancak Chromedriver, FF ve IE için web sürücüsünün sorun olmadığı yeri tıklamayı reddeder. Gerçek bir insanın açıklığın var olduğu hakkında hiçbir fikri yoktur ve tarayıcı bir insan olarak gerçekten tıkladığınızda umursamaz. Ne hareket etmek ne de beklemek bu sorunu çözmez; Chrome / chromedriver'dan kaçının veya sayfa 3'teki insanlar için tek seçenek olarak sayfanın HTML'sini yeniden yazın.
Don Simon

54
@DonSimon Seninle aynı sorunu yaşadım. Bunun yerine .Click yerine .SendKeys (Keys.Return) kullanarak başardım. Bu benim için bu sorunu yaşadığım Chrome'da ve bu özel bağlantıda (Div'e sarılmış çapa) benzer bir sorun yaşadığım Firefox'ta çalıştı.
Peter Bernier

17
@PeterBernier tarafından önerilen çözüm, öğenin bir div veya span içine sarıldığı durumlarda iyi çalışır. Python'da, tıklamayı simüle etmek ve Chrome'daki soruna geçici bir çözüm bulmak için .send_keys ('\ n') kullandım.
GJ

4
Bir öğe bir div öğesi tarafından gizlenmişse, aşağıdaki kod onu düzeltir. executeJavascript ("arguments [0] .click ();", selenium.findElement (konum belirleyici));
EsotericNonsense

Ayrıca öğenin tıklanabilir olmasını bekleyebilirsiniz. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus

67

Ayrıca JavaScript tıklamasını da kullanabilirsiniz ve kaydırma gerekmez.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);

5
Inanılmaz! Ben neden isDisplayed () ve isEnabled () bir öğeyi tıklamak için yeterli değildir ve selenum sağladıkları click () yöntemini çöpe atmıyor merak ediyorum ve bu tek bir çözüm gibi görünüyor. Teşekkürler!
Giovanni Bitliner

2
+1: Bu benim için işe yarayan çözüm. actions.MoveToElementC # benim için işe yaramadı ve diğer kaydırma çözümleri biraz kaydırma gibi görünüyordu, çünkü kaydırma öğeyi doğru bir şekilde göremiyor olabilir veya öğenin sayfadaki konumu değişebilir.
Kullanıcı

1
öğe görünmüyorsa, ancak sayfada mevcutsa bu çözüm en kolayıdır
Yashveer Rana

@Giovanni Bitliner Gerçek bir kullanıcı senaryosu olmadığı için bu yöntemi sağlamıyorlar. Kullanıcıların ayrıca yükleyici kaybolana kadar beklemesi gerekir. Bence bu selenyum hakkında harika bir şey.
Gideon Mulder

+1 Benim için de çalıştı. Koduma yeni flwg yöntemi ekledim: `` private void jsClick (IWebElement öğesi, IWebDriver sürücüsü) {IJavaScriptExecutor ex = (IJavaScriptExecutor) sürücüsü; ex.ExecuteScript ("argümanlar [0] .click ();", öğe); } `şu şekilde çağrıldı: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Jeremias

46

Bunun için krom sürücüsünde bir hata var gibi görünüyor (sorun düzeltilmeyecek olarak işaretlenmiş olması) -> GitHub Link

( FreedomSponsorlara ödül verin belki de mi?)

27 numaralı yorumda önerilen bir geçici çözüm var. Belki senin için işe yarar.


4
Adil görünüyor - düğme ekranda değilse gerçekten tıklanabilir değil.
Evan Knowles

Bu bir hata değil. Bu amaçlanan davranıştır ve doğrudur. Diğer önerildiği gibi, öğe görünüm alanının dışındaysa - öğeye kaydırmanız gerekir.
Alex Skrypnyk

Firefox'u denedim ve bu hatayı vermediğini gördüm, ancak tıklama yine de yok sayıldı. Üst div sıfır yüksekliğe sahip olduğu ortaya çıktı. Bu düzeltildikten sonra her ikisi de iyi çalıştı.
dansalmo

35

Aynı sorunu yaşadım, sunulan tüm çözümleri denedim ama benim için çalışmadılar. sonunda bunu kullandım:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));

Bu yardımcı olur umarım


16

Bunu selenyum güdümlü Chrome penceresinin çok küçük açıldığı durumlarda gördüm. Tıklanacak öğe görünüm dışına çıktı ve bu nedenle başarısız oldu.

Kulağa mantıklı geliyor ... gerçek kullanıcının pencereyi yeniden boyutlandırması veya öğeyi görmesi ve aslında tıklaması için kaydırması gerekir.

Selenyum sürücüsüne pencere boyutunu uygun şekilde ayarlamasını söyledikten sonra bu sorunlar benim için gitti. Webdriver API'sı burada açıklanmıştır .


15

Vay be, burada bir sürü cevap ve çok iyi cevaplar.

Umarım deneyimlerimden buna bir şey eklerim.

Çocuklar, benim durumumda, ara sıra elemanı gizleyen bir çerez katmanı vardı. Öğeye kaydırma da işe yarar; ama benim düşünceme göre (benim durumum için, herkes için her derde deva değil) en basit çözüm sadece tam ekrana gitmek (ben komutlarımı ekran penceresinin 3/4'ünde çalıştırıyordum)! İşte başlıyoruz:

driver.manage().window().maximize();

Umarım yardımcı olur!


13

Yakut / watir-webdriver / krom

Aşağıdaki hileyi kullanıyorum ve işe yarıyor gibi görünüyor:

#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"

# click myelement
myelement.when_present.fire_event("click")

1
Gördüğüm sorun bir alan haritasıydı. Hata burada orijinal yazı ile aynıydı - bir div "önünde" tıklamak için gerekli alan. Bu bir AJAX / zamanlama / sayfa yükleme sorunu değildi ve alan tam görünümünde oldu - Hatta odaklanmak için kaydırma olamazdı. Ancak, benim click yöntemini object.click yerine object.fire_event ("click") olarak değiştirmek sorunu benim için çözmüş gibi görünüyor. Firefox'un normal tıklamayı etkilememesi için bir başlangıç ​​/ kurtarma bloğunda bıraktım.
adam reed

Bu yaklaşım, görüntü alanında görünmeyen öğeler olduğunda benim için sorun etrafında çalıştı.
Jason R. Coombs

13

Ben de bu sorunla boğuştum. Kod FF'de iyi çalışıyor, Chrome'da başarısız oluyor. Yapmaya çalıştığım bir onay kutusunu tıklamaktı - eğer görünmüyorsa, görüntülemek için kaydırırdım ve sonra tıklardım. Görünümde kaydırma bile Chrome'da çalışır, ancak onay kutusunun yalnızca alttaki birkaç pikseli görünmediğinden web sürücüsü tıklamayı reddetti.

Benim geçici çözüm şudur:

WebElement element = _sectorPopup.findElement(...);

((Locatable) element).getCoordinates().inViewPort();
try {
    element.click();
} catch (Exception e) {
    new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
    element.click();
}

Chrome'un sendKeys ile ilgili sorunları da vardır, bazen Eylemler kullanmak gerekebilir. Açıkçası, kilometrenizin değişebilmesi için hangi yöne ve ne kadar gitmeniz gerektiğini bilmeniz gerekir. Ama bunu javascript kesmek için tercih ederim, bu yüzden başka birinin yararlı bulacağı durumda ben burada yayınlıyorum.


Yerelleştirilebilir.
Steve Staple

12

Xvfb-run ile başsız testleri çalıştırırken bu hatayı alıyordum. Yerel olarak kusursuz çalışıyorlardı. Chrome, webdriver / chromedriver / chrome / java vb. Sürümlerinin hepsi aynıdır.

Chromriver'daki 'düzeltilmeyecek' hatası - Tony Lâmpada'nın işaret ettiği GitHub Link , bunun ekranda görünen / görünmeyen şeylerle ilgili olabileceğini önerdi.

Xvfb-run için yardım iletisi aşağıdakileri gösterir:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Xvfb için çözünürlüğü değiştirmek hatayı ortadan kaldırdı:

xvfb-run -s "-screen 0 1280x1024x16" ...

9

İletki kullanırken bu bana yardımcı oldu:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();

8

İlk olarak, en son Chrome sürücüsünü almaya çalışın ve sorunun çözülüp çözülmediğini kontrol edin.

Benim durumumda, bu sorunu çözmedi. Ancak şu çözüm benim için şimdiye kadar işe yaradı. C # kodu aşağıdadır, ancak aynı mantığı kendi dilinizde takip edebilirsiniz. Burada yaptığımız şey,

Adım 1: Selenium Actions nesnesini kullanarak öğeye odaklanın,

Adım 2: Ardından öğeye tıklayın

Adım 3: Bir istisna varsa, Selenium tarayıcı sürücüsünün "ExecuteScript" yöntemiyle javascript komut dosyasını yürüterek öğede bir javascript "Click" olayını tetikleriz.

Ayrıca 1. ve 2. adımları atlayıp yalnızca 3. adımı da deneyebilirsiniz. Adım 3 kendi başına işe yarayacaktır, ancak bir senaryoda bazı garip davranışlar fark ettim, bu adım 3, öğeyi başarıyla tıklatmış olsa da, öğeyi tıklattıktan sonra kodumun diğer bölümlerinde beklenmedik davranışlara neden oldu.

            try
            {
                //Setup the driver and navigate to the web page...
                var driver = new ChromeDriver("folder path to the Chrome driver");
                driver.Navigate().GoToUrl("UrlToThePage");

                //Find the element...
                var element = driver.FindElement(By.Id("elementHtmlId")); 

                //Step 1
                new Actions(driver).MoveToElement(element).Perform();  

                //Step 2
                element.Click();
            }
            catch (Exception)
            {
                //Step 3
                driver.ExecuteScript("document.getElementById('elementHtmlId').click();");

            }

Aynı sorunu yaşıyordum. Actions sınıfını kullanma adımınız çok işe yarar. Bunu hiç düşünmezdim. Teşekkürler!
Conner

İlk adımınız harika bir çözüm.
Sovandara LENG

7

Bu yöntemi Tony Lâmpada'nın cevabından bir yoruma dayanarak yaptım. Çok iyi çalışıyor.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end

6

Python selenyum komut dosyası çalıştırırken aynı sorunu alıyordum. Öğeyi tıklatmak için kullandığım şey:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()

5

Birbiri ardına iki onay kutusunu kontrol etmek zorunda iken whre benzer bir sorunla karşı karşıyaydım.Ama ben yukarıdaki yukarıdaki aynı hata alıyordu. İşte adımlar: -

  When I visit /administrator/user_profiles
  And I press xpath link "//*[@id='1']"
  Then I should see "Please wait for a moment..."
  When I wait for 5 seconds
  And I press xpath link "//*[@id='2']"
  Then I should see "Please wait for a moment..."
  When I visit /administrator/user_profiles_updates

Bunun Gherkin sözdizimini kullanmanın uygun yolu olmadığını da eklemeniz yeterli. Adımlar "ne zaman - o zaman - sonra" şeklinde olmalı ve bunlar karıştırılmamalıdır. Bir "o zaman" dan sonra daha fazla "whens" gerekiyorsa, muhtemelen ayrı bir test senaryosu gereklidir.
Floella

5

Odağı kullanmanız veya o öğeyi kaydırmanız gerekir. Ayrıca explict wait kullanmanız gerekebilir.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

VEYA

Üstündeki Spinner / Overlay nedeniyle öğe tıklanabilir değil:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

VEYA

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

VEYA

Hala çalışmıyorsa kullanın JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);

3

Görünüşe göre bu, Chrome sürücü ikili dosyasındaki bir "Düzeltilmeyecek" hatasının sonucudur.

Benim için çalışan bir çözüm (Kilometre Değişebilir) bu Google Grubu tartışmasında, Yorum # 3'te bulunabilir:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

İlgili kısım tam burada:

O zamandan beri doğrudan yayının üst çapasının hrefine giderek sorunu çözdüm.

. Driver.Navigate () GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)) FindElement (By.XPath ( ".. ")) getAttribute (" href")..);

Benim durumumda, Python kullanıyorum, bu yüzden istenen öğeyi aldığımda,

driver.get(ViewElm.get_attribute('href'))

Ancak, sadece tıklamaya çalıştığınız eleman bir link ise, bu çalışmak için beklenir ...


3

Clj-webdriver (Selenyum'un clojure portu) ile aynı problemle karşı karşıyaydım . Önceki çözümü kolaylık sağlamak için clojure'a çevirdim. Tıklamadan önce veya bu sorunu önlemek için herhangi bir şey yapmadan bu işlevi çağırabilirsiniz.

(defn scrollTo
  "Scrolls to the position of the given css selector if found"
  [q]
  (if (exists? q) 
    (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] 
      (execute-script jscript))))

3

Sürücü tıklatmaya çalışırken öğe konumunu değiştirirse bu olabilir (bunu IE ile de gördüm). Sürücü başlangıç ​​konumunu korur, ancak üzerine gerçekten tıkladığı zaman, bu konum artık o öğeyi göstermez. FireFox sürücüsünde bu sorun BTW yoktur, görünüşe göre öğeleri programlı olarak "tıklar".

Her neyse, bu, animasyonları kullandığınızda veya öğelerin yüksekliğini dinamik olarak değiştirdiğinizde (örn. $("#foo").height(500)) Olabilir . Yalnızca yüksekliği "yerleştikten" sonra öğeleri tıklattığınızdan emin olmanız gerekir. Bu (C # bağlamaları) gibi görünen kod ile sona erdi:

if (!(driver is FirefoxDriver))
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
        d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}

Bir animasyon veya kolayca sorgulayamadığınız başka bir faktör durumunda, öğenin sabit olmasını bekleyen bir "genel" yöntem kullanabilirsiniz:

var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d => 
{
    var e = driver.FindElement(By.Id(someId));
    if (e.Location == prevLocation)
    {
        stationaryCount++;
        return stationaryCount == desiredStationarySamples;
    }

    prevLocation = e.Location;
    stationaryCount = 0;
    return false;
});

Bu benim yaşadığım şey gibi görünüyor. Aralıklı olarak OP'nin "Diğer Eleman ..." istisnasını alıyorum, ancak ekran görüntüleri modalın ekranda olduğunu ve elemanın kapalı olmadığını ve tıklamadan önce beklediğini kullandığımı gösteriyor. Tıkladığım mod açıldığında, aslında sayfadan aşağı kayar. Selenyumun DOM'u gerçek örneklerini ne zaman beklediğine bağlı olarak, modal hareket halindeyken yakalanırsa istisna atılabilir.
Levi Noecker

3

Bu öğede bir yükleme iletişim kutusu kapağı nedeniyle tanıştım. Bu elemanla çalışmadan önce bir bekleme ekleyerek basitçe çözüyorum.

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

Umarım bu yardım!


3

Hata mesajının açıklaması :

Hata mesajı basitçe, tıklamak istediğiniz öğenin mevcut olduğunu, ancak görünmediğini söylüyor. Bir şeyle kaplanabilir veya görünmeyen geçici bir şey olabilir.

Test anında elemanın görünmemesinin birçok nedeni olabilir. Lütfen sayfanızı yeniden analiz edin ve davanız için uygun çözümü bulun.

Özel durum için çözüm :

Benim durumumda, bu hata, az önce tıkladığım ekran öğesinin bir ipucu, sonraki tıklamak istediğim öğenin üzerine çıkarken meydana gelir. Odaklanma ihtiyacım olan bir çözümdü.

  • Nasıl odaklanmak için hızlı bir çözüm "hiçbir şey" resp ekranın başka bir bölümünde başka bir öğeye tıklamak olacaktır. bir tıklama işleminden sonra hiçbir şey olmuyor.
  • Uygun çözümelement.blur() , araç ipucunu açan öğeyi çağırmaktır , bu da araç ipucunu hayal kırıklığına uğratır.

3

Bu hatanın nedeni, tıklamaya çalıştığınız öğenin tarayıcının görünüm alanında (kullanıcı tarafından görülen bölge) olmamasıdır. Bunun üstesinden gelmenin yolu, önce istenen öğeye ilerleyip tıklamayı gerçekleştirmektir.

JavaScript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

Java:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}

2

Tony Lâmpada'nın cevabı, yorum # 27 gerçekten benim için problemi çözdü, ancak Java kodu sağladı ve Python'a ihtiyacım vardı. İşte öğenin konumuna ilerleyen ve ardından tıklayan bir Python işlevi.

def scroll_to_and_click(xpath):
    element = TestUtil.driver.find_element_by_xpath(xpath)
    TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
    element.click()

Bu, Chrome 34.0'da benim için sorunu çözdü. Firefox 28.0 ve IE 11'de zarar vermedi; bu tarayıcılar soruna tabi değildir, ancak tıklamadan önce öğenin konumuna geçmek hala kötü bir şey değildir.


2

Belki gerçekten temiz bir çözüm değil ama işe yarıyor:

try:
    el.click()
except WebDriverException as e:
    if 'Element is not clickable at point' in e.msg:
        self.browser.execute_script(
            '$("{sel}").click()'.format(sel=el_selector)
        )
    else:
        raise

2

Bu hatayı alıyordum çünkü bir fareyle testi yaptım ve daha sonra araç ipucunun altındaki bağlantıyı tıklamanız gerekiyordu. Çözüm, araç ipucunu yoldan çıkarmak için daha page.find('.sp-logo').hoverönce eklemekti click_link.


2

Komik, çeşitli cevaplara bakmak için harcadığım süre boyunca, hiç kimse bariz denemedi, tabii ki ben de yapmadım. Sayfanız, benim yaptığım gibi ("newButton") birden çok kez kullanılanla aynı kimliğe sahipse ve istediğiniz ad ilk bulunan öğe değilse, o zaman bu hatayı alırsınız. Yapılacak en kolay şey (C #):

var testIt = driver.FindElements(By.Id("newButton"));

Unutmayın FindElements değil, FindElements.

Ve sonra testten alındıktan sonra kaç sonuç geldiğini test edin. İkincisi ise, şunları kullanabilirsiniz:

testit[1].Click();

Ya da kimlikleri düzeltmek için yeniden kullanan herkesi alın.


Bunun nedeni, bu kimliğe göre birden fazla düğme bulunması ve aynı anda yalnızca bir düğmenin görüntülenmesiyse, üstün bir çözüm, görünür olan ilk öğeyi bulmak için LINQ kullanmayı içerir ( .First(x => x.Visible)FindElements çağrısına ekleyin ) ve boş değilse buna tıklayın.
Sean Duggan

2

Bahsedilen tüm önerileri test ettikten sonra hiçbir şey işe yaramadı. Bu kodu ben yaptım. Çalışıyor, ama güzel değil

public void click(WebElement element) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            element.click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

public void click(String css) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            driver.findElement(By.cssSelector(css)).click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

2

Bir çeşit kaba kuvvet yapıyorum ve bu benim için işe yarıyor.

try:
    elem.click()
except:
    print "failed to click"
    size = elem.size
    mid_of_y = int(size["height"])/2
    stepts_to_do_to_left = int(size["width"])
    while stepts_to_do_to_left > 0:
        try:
            print stepts_to_do_to_left, mid_of_y
            action = webdriver.common.action_chains.ActionChains(driver)
            action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
            action.click()
            action.perform()
            print "DONE CLICK"
            break
        except:
            pass

2

Sayfaya yüklediyseniz jQuery, aşağıdaki javascript komutunu yürütebilirsiniz:

"$('#" + element_id + "').click()"

Python yürütücüsü kullanan örnek:

driver.execute_script("$('#%s').click()" % element_id)

1

Aynı sorunu yaşadım ve bunun nedeni div ile div içindeki bağlantı arasındaki kimlik çatışmasıydı. Sürücü istediğim bağlantı yerine div'ı tıklıyordu. Div kimliğini değiştirdim ve düzgün çalıştı.

Önce:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Sonra:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>

Sorunlara neden olduğu için şaşırmadım. Sayfada yalnızca bir kimlik olmalıdır. Bu, kötü tasarımın gevşemesi bir çözüm değildi.
Dave Lawrence

1

Selenium kullanırken Drupal'da :

    // Get element.
    $element = $this->driver->getElement('xpath=//input');        
    // Get screen location.
    $location = $element->getLocation();
    // To make sure that Chrome correctly handles clicking on the elements 
    // outside of the screen, we must move the cursor to the element's location.
    $this->driver->moveCursor($location['x'], $location['y']);

    // Optionally, set some sleep time (0.5 sec in the example below) if your
    // elements are visible after some animation.
    time_nanosleep(0, 500000000);

    // Click on the element.
    $element->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.