2016-08-22 4 views
1

Alles, ich brauche ein wenig Hilfe mit Selen wartet. Ich kann nicht herausfinden, wie ich darauf warten kann, dass ein Element bereit ist.Selen warten auf Element klickbar python

Das Element, das ich mich finden kann, zu warten, bin benötigen und klicken Sie unten mein Skript über den Code ...

CreateJob = driver.find_element_by_xpath(".//*[@id='line']/div[1]/a") 

oder

CreateJob = driver.find_element_by_partial_link_text("Create Activity") 

ich brauche für diese warten Element auf der Seite und klickbar, bevor ich versuche, auf das Element zu klicken.

Ich kann den Befehl sleep verwenden, aber ich muss 5 Sekunden oder mehr warten und es scheint unzuverlässig und Fehler aus 1 von 8 mal oder so.

Ich kann nicht scheinen, die korrekte Syntax zu finden, um zu verwenden.

der HTML-Code dafür ist unten.

<document> 
<html manifest="https://tddf/index.php?m=manifest&a=index"> 
<head> 
<body class="my-own-class mozilla mozilla48 mq1280 lt1440 lt1680 lt1920 themered" touch-device="not"> 
<noscript style="text-align: center; display: block;">Please enable JavaScript in your browser settings.</noscript> 
<div id="wait" style="display: none;"> 
<div id="processing" class="hidden" style="display: none;"/> 
<div id="loading" class="hidden" style="display: none;"/> 
<div id="loadingPartsCatalog" class="hidden"/> 
<div id="panel"> 
<div id="top-toolbar" class="hidden" style="display: block;"> 
<div id="commands-line" class="hidden" style="display: block;"> 
<div id="line"> 
<div class="action-link"> 
<a class="tap-active" href="#m=activity/a=set" action_link_label="create_activity" component_gui="action" component_type="action">Create Activity</a> 
</div> 
<div class="action-link"> 
<div class="action-link"> 
<div class="action-link"> 
</div> 
<div id="commands-more" style="display: none;"> 
<div id="commands-list" class="hidden"> 
</div> 
<div id="provider-search-bar" class="hidden center" 

Antwort

3

Hier ist ein Link zu dem Abschnitt des Python Selenium docs 'wartet': http://selenium-python.readthedocs.io/waits.html#explicit-waits

Sie soll wie folgt aussehen warten:

element = WebDriverWait(driver, 10).until(
    EC.visibility_of((By.XPATH, ".//*[@id='line']/div[1]/a")) 
) 
+0

Das hat funktioniert. Irgendeine Idee, wie ich das anhand des Textes des Elements nutzen kann? – th2112

+2

'Element = WebDriverWait (Treiber, 10) .until ( EC.element_zu_be_klickbar ((By.LINK_TEXT," Create Activity ")) )' .. –

+0

@ th2112 Saurabh ist richtig, es gibt auch eine By.PARTIAL_LINK_TEXT. http://selenium-python.readthedocs.io/locating-elements.html – FamousJameous

0

Wenn Sie in Java sind unten versuchen WebDriverWait Syntax -

new WebDriverWait(driver,10,100).until(ExpectedConditions.visibilityOf(CreateJob)); 

Wartet 10ses und Umfragen alle 100 ms für den CreateJob Element sichtbar zu sein. Kann ExpectedConditions.elementToBeClickable(CreateJob) auch verwenden.

0

finde ich diese am einfachsten zu sein:

driver.implicitly_wait(10) 

Hier wird bis zu 10 Sekunden gewartet, bis das Skript abstürzt, wenn die erwarteten Bedingungen nicht erfüllt werden. Ich denke, es ist besser, als immer nach der Sichtbarkeit, der Klickbarkeit oder was auch immer es ist, nach dem Element zu suchen. Weniger effektiv und fehleranfälliger. Es hängt also mehr davon ab, warum Sie Selen verwenden.

Es lässt mich auch in meinen Selen-Skripten auf try/exception-Anweisungen verzichten, und da ich davon erfahren habe, habe ich auch viele time.sleep() -Funktionen reduziert.