What is the difference here that prevents this from working?

49 Views Asked by At

I'm reading a list of customer names and using each to find an element.

Before reading the list, I make can confirm this works when I hard-code the name,

    datarow = driver.find_element_by_xpath("//span[contains(text(),'ACME Anvil Company')]")

But when I read in the customer list and use it like this, I get a NoSuchElement exception. I know I'm getting the name into the customer variable because the print statement confirms it.

for customer in customerlist:
    print("START OF DATA FOR CUSTOMER: " +customer)
    datarow = driver.find_element_by_xpath("//span[contains(text(),'"+customer+"')]")

Do I have something wrong with the '" +customer+ "' part? I've tried it a bunch of different ways.

1

There are 1 best solutions below

1
On

Possibly the list elements e.g. customer, includes leading or trailing white spaces. So when you print through print() statement you are overseeing those.

But when you use the as:

datarow = driver.find_element_by_xpath("//span[contains(text(),'"+customer+"')]")

Those whitespaces comes into play and no matches are found.


Solution

You can use the following solution:

datarow = driver.find_element_by_xpath("//span[contains(.,'"+customer+"')]")

Ideally, to locate the element you need to induce WebDriverWait for the visibility_of_element_located() and you can use the following Locator Strategy:

datarow = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//span[contains(.,'"+customer+"')]")))