2

你能帮我写代码吗?我想解析电话号码,但我需要点击激活按钮。但是这个按钮带有标签,这对我来说是个问题。我该如何解决?

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
#from selenium.webdriver.common.touch_actions import TouchActions
#import org.openqa.selenium.interactions.Actions


#TouchActions.tap
def main():
    driver = webdriver.Chrome()
    remote = driver.get("https://www.olx.ua/uk/obyavlenie/68200jk71a-torpedo-pod-airbag-infiniti-g-07-14-infiniti-IDGRpUS.html#d97e6d976d;promoted")
    bt_elem = driver.find_elements_by_id("postNewAdLink")
    #print(bt_elem[0])
    #driver.find_elements_by_class_name("contact-button").click()
    #ActionChains(driver).move_to_element(bt_elem).perform().click()

    #bt_elem.get(0).click()
    #TouchActions.tap(bt_elem)

main()

错误:

Traceback (most recent call last):
  File "C:\Users\radus\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 945, in __del__
    self._internal_poll(_deadstate=_maxsize)
  File "C:\Users\radus\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1344, in _internal_poll
    if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
OSError: [WinError 6] Wrong descriptor
4

2 回答 2

1

此错误消息...

  File "C:\Users\radus\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 945, in __del__
    self._internal_poll(_deadstate=_maxsize)
  File "C:\Users\radus\AppData\Local\Programs\Python\Python38\lib\subprocess.py", line 1344, in _internal_poll
    if _WaitForSingleObject(self._handle, 0) == _WAIT_OBJECT_0:
OSError: [WinError 6] Wrong descriptor

...表示该subprocess.Popen()命令有错误。


根据Selenium 3.5.0-GeckoDriver 0.18.0-Python 3.6.1 中的讨论:通过 Python PyDev (Eclipse) unittest 模块调用 close() 时观察到“OSError: [WinError 6] The handle is invalid”这个问题即使在self.driver.close()通过Python 的 模块调用时也可以观察到。

This is because there is no stdin defined in the `service.py` file for the `subprocess.Popen()` command. Underwater the subprocess tries to create a handle which also looks for stdin under Windows this gets a bit tricky when using `Bash` or `cx_Freeze`. So, `stdin` was defined as well, and the crash is gone. Optionally you can also use:

FNULL = open(os.devnull, 'r')
subprocess.Popen(.... ,stdin=FNULL)

解决方案

该解决方案是从 Also define stdin 中合并的,否则它将在 Python + cx_Freeze: WindowsErro…</a> 拉取请求上崩溃,并且在Selenium v3.8.1

理想情况下,您需要确保:


tl; 博士

subprocess.Popen._cleanup() 某些旧进程消失时出现“句柄无效”错误

于 2020-03-03T22:52:05.100 回答
0

您的代码看起来不错...您的环境看起来很可疑。如果我冒险猜测(因为它是子进程模块在抱怨),也许 Selenium 在你的 PATH 中找不到 chrome.exe。Chrome 会在此异常之前打开吗?

于 2020-03-03T18:33:01.200 回答