如何将密钥发送到在硒(Python)中没有ID和/或名称的表单



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

我现在面临的挑战是,我想将键发送到输入字段,因此由于输入字段没有名称或 id,因此我使用 xpath 定位了输入字段:

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

我打印了这个,它返回了一些硒对象,但是当我尝试发送密钥时,例如:

xxx.send_keys('08100000000')

下面是 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)

欢迎您的意见。

错误消息显示该元素不可见。因此,您必须明确等待,直到它变得可见。使用此处所述的预期条件。

最后,您的代码可能如下所示(最多等待 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')

关于错误,您需要等待元素显示并启用才能与之交互。你可以阅读"隐含和显式等待在硒中"来学习它。

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

还有一个额外的提示。

通常,当元素很难找到,甚至无法用ID或CssSelector找到时,我们使用XPath。这是因为XPath作为CssSelector并不常见,并且根据它的编写方式更难理解。

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

由于您的 html 只有一个 idtxtUserPhoneNumber的元素,并且您想要的元素在其中,让我们开始选择它。之后,查看所需元素的标记名称。里面只有一个input元素?好!因此,我们可以仅使用这几个信息来访问该元素。

Css选择器:

#txtUserPhoneNumber 输入

Xpath:

//*[@id='txtUserPhoneNumber ']//input

此错误消息...

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

。意味着您调整的定位器策略不会识别网页上任何唯一的 WebElement

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

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

支持铬 v62-64

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

支持铬 v65-67

因此,ChromeDriver版本(v2.35(和Chrome浏览器版本(v66.0(之间存在明显的不匹配。

溶液

  • 升级到当前级别版本 3.11.0
  • ChromeDriver升级到当前的ChromeDriver v2.38级别。
  • Chrome 版本保持在Chrome v66.x级别。(根据ChromeDriver v2.38发行说明(
  • 通过IDE清理项目工作中心,并仅使用所需的依赖项重新生成项目。
  • 使用CCleaner工具在执行测试套件之前和之后清除所有操作系统杂务。
  • 如果您的基本 Web 客户端版本太旧,请通过Revo 卸载程序将其卸载,并安装最新的 GA 和已发布版本的Web 客户端
  • 重新启动系统
  • 当你看到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

相关内容

  • 没有找到相关文章

最新更新