2016-07-19 6 views
0

Ich habe über veraltete Elemente gelesen und bin immer noch ein bisschen verwirrt. Zum Beispiel wird das Folgende nicht funktionieren, richtig?Advanced Stale Elemente

public void clickFoo(WebElement ele) { 
    try { 
     ele.click(); 
    } catch (StaleElementReferenceException ex) { 
     ele.click(); 
    } 
} 

weil, wenn ele veraltet ist, wird es abgestanden bleiben. Am besten ist es, driver.findElement (By) zu wiederholen, aber wie Sie in diesem Beispiel sehen können, gibt es keinen xpath. Sie können versuchen, ele.getAttribute ("id") zu verwenden und das verwenden, aber wenn das Element keine ID hat, wird dies auch nicht funktionieren. Alle Methoden, die dies nennen, müssten den Versuch/Fang darum herum setzen, was möglicherweise nicht durchführbar ist.

Gibt es eine andere Möglichkeit, das Element wieder zu finden? Unter der Annahme, dass es eine ID gibt, würde die ID auch gleich bleiben, nachdem das Element veraltet ist? Was ist im WebElement-Objekt ele anders, wenn es alt wird?

(Java Eclipse)

Antwort

1

Ich würde Ihnen empfehlen, nicht eine Methode, wie oben zu erstellen. Es ist nicht erforderlich, eine weitere Funktionsebene über .click() hinzuzufügen. Rufen Sie einfach .click() auf dem Element selbst an.

driver.findElement(By.id("test-id")).click(); 

oder

WebElement e = driver.findElement(By.id("test-id")); 
e.click(); 

Eine Möglichkeit, die ich regelmäßig veraltete Elemente zu vermeiden, verwenden Sie das Element finden nur dann, wenn Sie es brauchen und in der Regel das ich tun, indem Sie auf einer Seite Objektmethode. Hier ist ein kurzes Beispiel.

Das Seitenobjekt für eine Homepage.

public class HomePage 
{ 
    private WebDriver driver; 
    public WebElement staleElement; 
    private By waitForLocator = By.id("sampleId"); 

    // please put the variable declarations in alphabetical order 
    private By sampleElementLocator = By.id("sampleId"); 

    public HomePage(WebDriver driver) 
    { 
     this.driver = driver; 
     // wait for page to finish loading 
     new WebDriverWait(driver, 10).until(ExpectedConditions.presenceOfElementLocated(waitForLocator)); 

     // see if we're on the right page 
     if (!driver.getCurrentUrl().contains("samplePage.jsp")) 
     { 
      throw new IllegalStateException("This is not the XXXX Sample page. Current URL: " + driver.getCurrentUrl()); 
     } 
    } 

    public void clickSampleElement() 
    { 
     // sample method code goes here 
     driver.findElement(sampleElementLocator).click(); 
    } 
} 

Um es Ich habe nicht mehr

WebDriver driver = new FirefoxDriver(); 
driver.manage().window().maximize(); 
driver.get("http://www.example.com"); 
HomePage homePage = new HomePage(driver); 
homePage.clickSampleElement(); 
// do stuff that changes the page and makes the element stale 
homePage.clickSampleElement(); 

nun mit auf eine alte Referenz verlassen. Ich rufe die Methode einfach nochmal an und es macht die ganze Arbeit für mich.

Es gibt viele Referenzen auf dem Seitenobjektmodell. Hier ist eine aus dem Selen Wiki. http://www.seleniumhq.org/docs/06_test_design_considerations.jsp#page-object-design-pattern

Wenn Sie mehr Informationen darüber, was ein veraltetes Element ist, lesen möchten, haben die Dokumente eine gute Erklärung. http://docs.seleniumhq.org/exceptions/stale_element_reference.jsp

+0

Danke. Ich verstehe das. Es ist nur so, dass einige Methoden ein Element und keinen XPath verwenden. Und einige Methoden verwenden das Seitenobjekt @FindBy(), das dem ähnelt, was Sie sagten. Aber einige Elemente sind bis zur Laufzeit nicht bekannt (zum Beispiel muss ich ein div für ein bestimmtes Büro finden, und dann div.findBy verwenden ... Ich nehme an, wir hätten früher versuchen sollen, immer den xpath für ein Element zu kennen (oder ID oder was auch immer) – Tony

+0

Für Methoden, die ein Element verwenden, können Sie das Element mithilfe des Locators finden und dann an die Methode übergeben. Wenn Sie Szenarien haben, in denen Sie ein Element für ein bestimmtes Büro finden müssen, Du solltest in der Lage sein, einen Locator zu erstellen, der das für dich dynamisch macht. – JeffC

+0

Wie auch immer ... wenn du diese Antwort für hilfreich empfindest, bitte upvote. Wenn sie deine Frage beantwortet, akzeptiere sie sie bitte als Antwort ] (// stackoverflow.com/help/someone-answers) für mehr Informationen darüber, wie und warum man eine Antwort upvotet und akzeptiert. – JeffC