2015-09-17 7 views
6

Sembra che questo funzionasse, ma non funziona più. Forse c'è qualche interruttore da qualche parte che lo abilita? Utilizzando questo codiceCome utilizzare l'automazione dell'interfaccia utente per recuperare il testo da Edge Browser

private static async Task<string> getText(double x, double y) 
{ 
    try 
    { 
     var location = new System.Windows.Point(x, y); 
     AutomationElement element = AutomationElement.FromPoint(location); 

     object patternObj; 
     if (element.TryGetCurrentPattern(TextPattern.Pattern, out patternObj)) 
     { 
      var textPattern = (TextPattern)patternObj; 

      var range = textPattern.RangeFromPoint(location); 
      range.ExpandToEnclosingUnit(TextUnit.Word); 

      var text = range.GetText(-1).Trim(); 
      return text; 
     } 
     else 
     { 
      return "no text found"; 
     } 
    } 
    catch (Exception ex) 
    { 
     return ex.Message; 
    } 
} 

E funziona su applicazioni della metropolitana con browers (anche se un po 'traballante, se si scorre troppo veloce). Per il manifest sto usando uiAccess = true, AsInvoker. Quando viene eseguito come amministratore, non aiuta.

Aggiornamento . Una soluzione che utilizza WebDriver è accettabile se può fare la stessa cosa.

+0

A che punto il codice non funzionano più come previsto? (Ad esempio, il modello di testo non è supportato o RangeFromPoint() restituisce un intervallo imprevisto.) Ci dovrebbe essere un elemento in Edge che supporta il modello di testo. Quindi forse FromPoint() non restituisce quell'elemento. Potresti controllare le proprietà di quell'elemento per determinare quale elemento hai. Se non è l'elemento che supporta il modello di testo, è possibile passare all'elemento del modello di testo dall'elemento restituito da FromPoint(). –

+0

È possibile che da punto non funzioni, anche se ne ho bisogno. – tofutim

+4

La tua domanda è troppo ampia in quanto potrebbe/dovrebbe funzionare nel caso generale. Si prega di fornire un caso di riproduzione completa. –

risposta

0

Al momento della stesura di Microsoft Edge non è supportato da CodedUI, hanno detto che stanno valutando il supporto, ma al momento non è possibile utilizzarlo: Questo link mostra un bug depositato sul tema: https://connect.microsoft.com/VisualStudio/feedback/details/1551238/vs2015-supports-codedui-automation-test-for-edge-browser

WebDriver è il modo attualmente migliore per automatizzare Microsoft Edge. Tuttavia guardando il codice sopra non sei in grado di fare esattamente la stessa cosa. Con WebDriver puoi localizzare un elemento tramite Id, ClassName, TagName, Name, LinkText, Partial Link Text, CSS, Xpath ma, per quanto ne so, non puoi localizzare un oggetto da x, y coordina come fai tu l'esempio sopra.

Per iniziare con Webdriver. Crea un'app per console. Installare i seguenti pacchetti:

Install-Package Selenium.RC 
Install-Package Selenium.WebDriver 
Install-Package Selenium.WebDriverBackedSelenium 
Install-Package Selenium.Support 

installare il corretto WebDriver Microsoft a seconda del sistema operativo:

Ulteriori informazioni su Microsoft WebDriver sono disponibili here.

È quindi possibile aggiungere del codice a guidare WebDriver, l'esempio seguente va al mio blog e ottiene un elemento tramite il suo nome di classe CSS:

using System; 
using System.IO; 
using OpenQA.Selenium; 
using OpenQA.Selenium.Edge; 
using OpenQA.Selenium.Remote; 
using OpenQA.Selenium.Support.UI; 

namespace SampleGetText 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
      var text = GetText(); 
     } 

     public static string GetText() 
     { 
      RemoteWebDriver driver = null; 
      string serverPath = "Microsoft Web Driver"; 
      // Makes sure we uses the correct ProgramFiles depending on Enviroment 
      string programfiles = Environment.Is64BitOperatingSystem ? "%ProgramFiles(x86)%" : "%ProgramFiles%"; 

      try 
      { 
       // Gets loaction for MicrosoftWebDriver.exe 
       serverPath = Path.Combine(System.Environment.ExpandEnvironmentVariables(programfiles), serverPath); 

       //Create a new EdgeDriver using the serverPath 
       EdgeOptions options = new EdgeOptions(); 
       options.PageLoadStrategy = EdgePageLoadStrategy.Eager; 
       driver = new EdgeDriver(serverPath, options); 

       //Set a page load timeout for 5 seconds 
       driver.Manage().Timeouts().SetPageLoadTimeout(TimeSpan.FromSeconds(5)); 

       // Navigate to my blog 
       driver.Url = "https://blogs.msdn.microsoft.com/thebeebs/"; 

       // Find the first element on my screen with CSS class entry-title and return the text 
       IWebElement myBlogPost = driver.FindElement(By.ClassName("entry-title")); 
       return myBlogPost.Text; 
      } 
      catch (Exception e) 
      { 
       Console.WriteLine(e.Message); 
       return ""; 
      } 
      finally 
      { 
       if (driver != null) 
       { 
        driver.Close(); 
       } 
      } 
     } 
    } 
} 
Problemi correlati