0

Ich habe einen Code, Selenium zu warten, bis ein Element anklickbar ist, aber aus irgendeinem Grund Selenium nicht warten, sondern klicken Sie auf das Element und eine nicht anklickbare Punkt (x, y) sofort anheben. Irgendeine Idee, wie man das repariert?Selen explizite warten nicht

x = '//*[@id="arrow-r"]/i' 
driver = webdriver.Chrome(path) 
driver.get('https://www.inc.com/inc5000/list/2017') 
WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, x))) 
driver.find_element_by_xpath(x).click() 
+0

im Zusammenhang Was EC-Klasse ist? – cezarypiatek

+0

@cezarypiatek Erwartete Bedingungen –

+0

EC.element_zu_be_klickbar prüfen, ob Element sichtbar und aktiviert ist. In Bezug auf die Sichtbarkeit deckt es das Szenario nicht ab, wenn Element hinter anderen steht. Vielleicht benutzt Ihre Seite etwas wie blockUI-Widget und click() tritt auf, bevor das Cover verschwindet. – cezarypiatek

Antwort

0

Hier ist ein Link auf die für die Dokumentation Python Selenium Abschnitt 'wartet': Click here

Warten sein wird:

element = WebDriverWait(driver, 10).until(
    EC.visibility_of((By.XPATH, "Your xpath")) 
) 
element.click(); 
+0

Es würde immer noch nicht funktionieren. –

+0

Welchen Fehler bekommen Sie jetzt? – zsbappa

+0

immer noch nichtklickbare Element bei Punkt –

1

EC.element_to_be_clickable prüfen, ob Element sichtbar und aktiviert . In Bezug auf die Sichtbarkeit deckt es das Szenario nicht ab, wenn Element hinter anderen steht. Vielleicht benutzt Ihre Seite etwas wie blockUI-Widget und click() tritt auf, bevor das Cover verschwindet. Sie können überprüfen, ob das Element wirklich anklickbar ist, indem Sie EC.element_to_be_clickable ((By.XPATH, x)) ankreuzen, um sicherzustellen, dass das Element nicht von einem anderen Element zurückgehalten wird. In meinen Projekten verwende ich die Umsetzung wie folgt:

static bool IsElementClickable(this RemoteWebDriver driver, IWebElement element) 
{ 
    return (bool)driver.ExecuteScript(@" 
      (function(element){ 
       var rec = element.getBoundingClientRect(); 
       var elementAtPosition = document.elementFromPoint(rec.left+rec.width/2, rec.top+rec.height/2); 
       return element == elementAtPosition || element.contains(elementAtPosition); 
      })(arguments[0]); 
    ", element); 
} 

Dieser Code ist in C#, aber ich bin sicher, dass Sie einfach in Ihre Programmiersprache der Wahl übersetzen.

UPDATE: Ich schrieb einen Blog-Post über Probleme zu klicken mit Selen Rahmen https://cezarypiatek.github.io/post/why-click-with-selenium-so-hard/