Environment:
Python 3.7
Windows 10 64Bits
Problem:
I am making a script with Appium Python 3.7. My script is making a search and needs to get the search results. In some cases, it can happen there isn’t any result at all. In this particular case of no result, Python raises an exception. When it gets some results, I get a list of elements. Here is the line of code:
search_results = driver.find_elements_by_id('com.myapp.android:id/row_search_user_username')
I tried many different lines of code to handle this scenario but I always get the error message:
cannot unpack non-iterable NoneType object
Here are the lines of code I tried to handle this scenario of “No results”:
if search_results:
if search_results is not None:
if len(search_results)!=0:
But it always raises an exception as it cannot find the elements ‘com.myapp.android:id/row_search_user_username’.
So I tested with an Xpath search:
search_results = driver.find_elements_by_xpath("//*[contains(@resource-id, 'com.instagram.android:id/row_search_user_username')]")
But I get the same error.
So I tried to handle that with “Try/Exception” but due to the complexity of my program, this Try/Exception is nested inside a global Try/exception. The problem is when the exception is raised, it is the global Exception raising the error instead of the local one which supposes to handle the scenario of “No elements found”. As a result, instead of handling locally the exception, the script goes to the end of the program where there is my global exception.
I think by looking at the code, you may understand better my issue:
def search_function(driver):
try:
# make the search in the search field
search_results = driver.find_elements_by_xpath("//*[contains(@resource-id, 'com.myapp.android:id/row_search_user_username')]")
if search_results:
# do some stuff
except Exception as ex: #the local exception which supposes to be raised instead of the global one below
print(f"{ex} --> There wasn't obviously any result for the search .")
found_it = False
# here some other code I would like to execute in order to carry on the execution of my script
def main():
try:
#do some stuff......
search_function(driver)
except Exception as ex: #the global exception which stop the script and show the error message.
print(f"|||{ex} --> Error with main() method!!!")
if __name__ == '__main__':
main()
As a resume, Python is raising the main exception of the main() method instead of raising the local one in my search() function.
Do you have any idea how can I solve this problem? Does anyone can help me please?