【问题标题】:How to send keys to a form with no id and or name in selenium (Python)如何在 selenium (Python) 中将密钥发送到没有 id 和/或名称的表单
【发布时间】:2018-05-02 13:33:31
【问题描述】:

我正在从一个网站获取数据,每当我点击一个链接以获取电话号码时,都会打开一个模式表单,首先询问我的电话号码,然后电话号码会显示给我。

我现在面临的挑战是,我想向输入字段发送键,所以因为输入字段没有名称或 ID,我使用 xpath 定位输入字段:

xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")

我打印了这个,它返回了一些 selenium 对象,但是当我尝试发送如下键时:

xxx.send_keys('08100000000')

这是一个sn-p的html代码:

<div class="row">
<div class="medium-12 columns">
    <div class="guest-text">
        One step closer! <br />
        <span>Please provide your contact number to view business contact details</span>
    </div>

    <form action="" data-abide="ajax" novalidate="novalidate">
        <div id="txtUserPhoneNumber" ng-show="!isLoggedIn && collectUserPhone == ''" class="guest-no">
            <label>
                <div class="guest-label">Phone Number</div>
                <input type="text" placeholder="081xxxxxxxx" ng-model="UserPhoneNew" required data-invalid="" aria-invalid="true" maxlength="11">

            </label>
        </div>
    </form>
</div>

我试过了:

xxx = driver.find_element_by_xpath("//input[@placeholder='081xxxxxxxx']")
xxx.send_keys('08100000000')

dummy_number = driver.find_element_by_xpath("//div[contains(@class, 'modal small guest')]/div[contains(@class, 'guest-modal-wrapper')]//form[1]//input[1]")
dummy_number.send_keys('081000000')

我收到错误提示:

Traceback (most recent call last):
File "Dropbox/automation/vconnect.py", line 76, in <module>
    RunAutomation.instantiatechrome()
  File "Dropbox/automation/vconnect.py", line 61, in instantiatechrome
    xxx.send_keys('081xxxxxxxx')
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 479, in send_keys
    'value': keys_to_typing(value)})
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webelement.py", line 628, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 312, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 237, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not visible
  (Session info: chrome=66.0.3359.139)
  (Driver info: chromedriver=2.35.528139 (47ead77cb35ad2a9a83248b292151462a66cd881),platform=Linux 4.13.0-39-generic x86_64)

欢迎您的意见。

【问题讨论】:

  • 分享相关的HTML和你的代码试验
  • 我已经编辑了问题并添加了 HTML 代码
  • 您确定placeholder 的值稳定吗?看起来有点像生成的值。确切的错误类型和消息是什么?
  • 占位符没有改变,我添加了确切的错误类型@Würgspaß

标签: python selenium selenium-webdriver selenium-chromedriver webdriverwait


【解决方案1】:

错误消息说该元素不可见。所以你必须明确地等到它变得可见。使用ExpectedCondition as described here

最终您的代码可能如下所示(最多等待 120 秒):

from selenium.webdriver.support import expected_conditions as EC

...

wait = WebDriverWait(driver, 120)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "//input[@placeholder='081xxxxxxxx']")))
element.send_keys('08100000000')

【讨论】:

  • 这真的很有帮助...谢谢
  • @molecules 很高兴听到。 Stackoverflow 标记有用答案的方法是使用左侧的箭头投票和/或接受答案。
【解决方案2】:

关于错误,您需要等待元素显示并启用交互。您可以通过阅读“Selenium 中的隐式和显式等待”来了解它。

在这里你可以找到一些额外的信息:https://stackoverflow.com/a/27600986/5120498

还有一个额外的小费。

一般来说,当一个元素很难找到,甚至无法通过 ID 或 CssSelector 找到时,我们才使用 XPath。这是因为 XPath 不像 CssSelector 那样常见,并且根据它的编写方式更难理解。

当我们需要使用 XPath 或 CssSelector 查找某个元素时,首先我们需要检查与页面交互后哪些值不会改变,以及哪些值为我们提供了唯一值(当我们只需要一个元素时,的)。

由于您的 html 只有一个 id 为 txtUserPhoneNumber 的元素,而您想要的元素就在其中,让我们开始选择它。之后,查看所需元素的标签名称。里面只有一个input 元素?好的!所以我们可以只使用这几个信息来访问元素。

CssSelector:

#txtUserPhoneNumber 输入

Xpath:

//*[@id='txtUserPhoneNumber ']//输入

【讨论】:

  • 这真的很有帮助...谢谢
【解决方案3】:

此错误消息...

selenium.common.exceptions.ElementNotVisibleException: Message: element not visible

...暗示您采用的定位器策略无法识别网页上的任何独特的WebElement

但是有几个问题,包括您使用的二进制文件之间的版本兼容性,如下所示:

  • 您正在使用 chromedriver=2.35
  • chromedriver=2.35 的发行说明明确提及以下内容:

支持 Chrome v62-64

  • 您正在使用 chrome=66.0
  • ChromeDriver v2.38 的发行说明明确提及以下内容:

支持 Chrome v65-67

所以 ChromeDriver 版本 (v2.35) 和 Chrome 浏览器 之间存在明显的不匹配版本(v66.0

解决方案

  • Selenium升级到当前级别Version 3.11.0
  • ChromeDriver 升级到当前的ChromeDriver v2.38 级别。
  • Chrome 版本保持在 Chrome v66.x 级别。 (as per ChromeDriver v2.38 release notes)
  • 清理你的项目工作区通过你的IDE重建你的项目只需要依赖。
  • 使用CCleaner 工具在执行测试套件之前和之后清除所有操作系统杂务。
  • 如果您的基础 Web Client 版本太旧,请通过 Revo Uninstaller 卸载它并安装最新的 GA 和发布版本的 Web Client
  • 进行系统重启
  • 当您看到 ElementNotVisibleException 时,您需要诱导 WebDriverWait 以使 WebElement 可点击,如下所示:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    # other code
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//form[@data-abide='ajax']//input[@ng-model='UserPhoneNew']"))).send_keys("08100000000")
    
  • 执行你的@Test

注意:这里有关于ElementNotVisibleException : Selenium Python的详细讨论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-16
    • 2013-05-30
    相关资源
    最近更新 更多