Working with TextMeshPro (TMP) input fields

Learn how to troubleshoot TextMeshPro input fields when working with GameDriver

Problem

When working with TMP text fields, particularly those where user input is provided, the TMP component will append a non-printable Unicode (0xE2, 0x80, 0x8B) or ASCII "?" character (0x3f) that can sometimes result in a failed assertion during testing. When running your test, a field validation can fail while the visible text values are the same. For example:

Test:

api.SetInputFieldText("//FilterInputTxt[@name='TextMeshPro InputField']", "America");
Assert.IsTrue(api.WaitForObjectValue("//*[@name='Text']/fn:component('TMPro.TextMeshProUGUI')", "text", "America"));

Output:

Wait for object value expired for object 54bdb9d4-3616-4ce1-a2ed-1cf8e750b95b.
Waiting for value = 'America' [0x41, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x61]
Last value = 'America' [0x41, 0x6D, 0x65, 0x72, 0x69, 0x63, 0x61, 0x3F]
UnityEngine.Debug:LogError (object)
gdio.unity_agent.GDIOLogger:Error (object) (at c:/temp/github/gdio99/src/gdio.unity_agent/gdio_unity_agent/GDIOLogger.cs:74)
gdio.unity_agent.GDIOAgent:ProcessWaitForObjectsAndValues () (at c:/temp/github/gdio99/src/gdio.unity_agent/gdio_unity_agent/GDIOAgent.cs:744)
gdio.unity_agent.GDIOAgent:Update () (at c:/temp/github/gdio99/src/gdio.unity_agent/gdio_unity_agent/GDIOAgent.cs:2714)

To ignore the non-printed character when using WaitForObjectValue, add the following config value to the GameDriver agent in /Assets/GDIO/Resources/config/gdio.unity_agent.config.txt:

<unicode><ignoreZeroWidthSpace enabled="true"/></unicode>

To validate the contents of the field via the API client, you will need to include the full contents of the field. For example:

bool bWaitForStr = api.WaitForObjectValue("/[@name='Canvas']/[@name='InputField (TMP)']/[@name='Text Area']/[@name='Text']/fn:component('TMPro.TextMeshProUGUI')", "text", "Hello GDIO API", true, 10);

string returnedString = api.GetObjectFieldValue<string>("/[@name='Canvas']/[@name='InputField (TMP)']/[@name='Text Area']/[@name='Text']/fn:component('TMPro.TextMeshProUGUI')/@text");

byte[] utf8bytes = System.Text.Encoding.UTF8.GetBytes(returnedString);
byte[] asciibytes = System.Text.Encoding.ASCII.GetBytes(returnedString);

if ("Hello GDIO API\u200b".Equals(System.Text.Encoding.UTF8.GetString(utf8bytes)))
Console.WriteLine("UTF8 does Match");
else
Console.WriteLine("UTF8 does NOT Match");

if ("Hello GDIO API\x3f".Equals(System.Text.Encoding.ASCII.GetString(asciibytes)))
Console.WriteLine("ASCII does Match");
else
Console.WriteLine("ASCII does NOT Match");