尝试通过Python使用Selenium定位输入框元素时无法定位元素错误

时间:2019-03-28 13:32:31

标签: python-3.x selenium-webdriver xpath css-selectors webdriverwait

我正在尝试使用Python和Selenium查找文本框。.我通过ID,按名称尝试了by_css_selector,通过XPATH,但消息始终相同:

Unable to locate element: #x-auto-225-input

这是一段html。我想找到文本框来填充它。

<td class="x-table-layout-cell" role="presentation" style="padding: 2px;">
    <div role="presentation" class=" x-form-field-wrap  x-component" id="x-auto-225" style="width: 150px;"></div>
    <input type="text" class=" x-form-field x-form-text " id="x-auto-225-input" name="PURCHASE_ORDER_CODE_NAME" tabindex="0" style="width: 150px;">
</td>

我最后一次尝试是:

pc = browser.find_element_by_css_selector("#x-auto-225-input").click()
pc.send_keys("7555425-1")

3 个答案:

答案 0 :(得分:1)

在html上,提到的id可以是动态的,因此不能将静态ID放在标识符中。
但是,由于html中存在name属性,因此您可以使用该属性来标识您的元素,例如:

browser.find_element_by_name("PURCHASE_ORDER_CODE_NAME").click()

根据与OP的讨论更新的答案

由于UI中存在iframe,因此您需要先切换到iframe,然后单击该元素。
要切换到iframe,您可以使用:

browser.switch_to.frame(browser.find_element_by_tag_name('iframe'))

然后使用:

pc = browser.find_element_by_name("PURCHASE_ORDER_CODE_NAME")
pc.click()
pc.send_keys("7555425-1")

如果要切换回默认内容,可以使用:

browser.switch_to.default_content()

答案 1 :(得分:0)

所需元素是动态元素,因此要对该元素调用click(),必须诱使 WebDriverWait 使元素可点击,并且可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input.x-form-field.x-form-text[id$='-input'][name='PURCHASE_ORDER_CODE_NAME']"))).click();
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//input[@class=' x-form-field x-form-text ' and contains(@id,'-input')][@name='PURCHASE_ORDER_CODE_NAME']"))).click();
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

答案 2 :(得分:0)

也许您可以尝试另一种“选择器”方法。例(Javascript):

selenium.By.xpath('//*[@data-icon="edit"]')
driver.findElement(by).click()