我使用以下库进行测试:
py==1.4.31
pytest==2.8.5
requests==2.9.1
robotframework==2.8.5
robotframework-selenium2library==1.5.0
selenium==3.3.1
python 2.7
每当我尝试在Firefox上执行Action Chains命令时,我都会收到WebDriverException。该代码适用于Chrome和IE。我尝试了几种不同风格的Action Chain命令,但两者都失败了。
ActionChains(self.driver).key_down(Keys.SHIFT).click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[0] + "']")).click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[1] + "']")).click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[2] + "']")).key_up(Keys.SHIFT).perform()
......和......
ActionChains(self.driver) \
.key_down(Keys.SHIFT) \
.click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[0] + "']")) \
.click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[1] + "']")) \
.click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[2] + "']")) \
.key_up(Keys.SHIFT) \
.perform()
从命令中可以看出,我在屏幕上选择对象时按住shift键。然后我释放换档键。这是我收到的失败:
firewall.py:454: in editCommon
ActionChains(self.driver).key_down(Keys.SHIFT).click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[0] + "']")).click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[1] + "']")).click(self.driver.find_element_by_xpath("//select[@name='ctstate']/option[@value='" + stateList[2] + "']")).key_up(Keys.SHIFT).perform()
C:\Python27\lib\site-packages\selenium-3.3.1-py2.7.egg\selenium\webdriver\common\action_chains.py:80: in perform
action()
C:\Python27\lib\site-packages\selenium-3.3.1-py2.7.egg\selenium\webdriver\common\action_chains.py:232: in <lambda>
{"value": keys_to_typing(value)}))
C:\Python27\lib\site-packages\selenium-3.3.1-py2.7.egg\selenium\webdriver\remote\webdriver.py:238: in execute
self.error_handler.check_response(response)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <selenium.webdriver.remote.errorhandler.ErrorHandler object at 0x05615430>
response = {'status': 500, 'value': '{"value":{"stacktrace":"org.openqa.selenium.UnsupportedCommandException: sendKeysToActiveEle...: \'10.0\', java.version: \'1.8.0_151\'\nDriver info: driver.version: unknown","error":"unknown command"},"status":9}'}
def check_response(self, response):
"""
Checks that a JSON response from the WebDriver does not have an error.
:Args:
- response - The JSON response from the WebDriver server as a dictionary
object.
:Raises: If the response contains an error message.
"""
status = response.get('status', None)
if status is None or status == ErrorCode.SUCCESS:
return
value = None
message = response.get("message", "")
screen = response.get("screen", "")
stacktrace = None
if isinstance(status, int):
value_json = response.get('value', None)
if value_json and isinstance(value_json, basestring):
import json
try:
value = json.loads(value_json)
if len(value.keys()) == 1:
value = value['value']
status = value.get('error', None)
if status is None:
status = value["status"]
message = value["value"]
if not isinstance(message, basestring):
value = message
try:
message = message['message']
except TypeError:
message = None
else:
message = value.get('message', None)
except ValueError:
pass
exception_class = ErrorInResponseException
if status in ErrorCode.NO_SUCH_ELEMENT:
exception_class = NoSuchElementException
elif status in ErrorCode.NO_SUCH_FRAME:
exception_class = NoSuchFrameException
elif status in ErrorCode.NO_SUCH_WINDOW:
exception_class = NoSuchWindowException
elif status in ErrorCode.STALE_ELEMENT_REFERENCE:
exception_class = StaleElementReferenceException
elif status in ErrorCode.ELEMENT_NOT_VISIBLE:
exception_class = ElementNotVisibleException
elif status in ErrorCode.INVALID_ELEMENT_STATE:
exception_class = InvalidElementStateException
elif status in ErrorCode.INVALID_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR \
or status in ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPER:
exception_class = InvalidSelectorException
elif status in ErrorCode.ELEMENT_IS_NOT_SELECTABLE:
exception_class = ElementNotSelectableException
elif status in ErrorCode.INVALID_COOKIE_DOMAIN:
exception_class = WebDriverException
elif status in ErrorCode.UNABLE_TO_SET_COOKIE:
exception_class = WebDriverException
elif status in ErrorCode.TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.SCRIPT_TIMEOUT:
exception_class = TimeoutException
elif status in ErrorCode.UNKNOWN_ERROR:
exception_class = WebDriverException
elif status in ErrorCode.UNEXPECTED_ALERT_OPEN:
exception_class = UnexpectedAlertPresentException
elif status in ErrorCode.NO_ALERT_OPEN:
exception_class = NoAlertPresentException
elif status in ErrorCode.IME_NOT_AVAILABLE:
exception_class = ImeNotAvailableException
elif status in ErrorCode.IME_ENGINE_ACTIVATION_FAILED:
exception_class = ImeActivationFailedException
elif status in ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS:
exception_class = MoveTargetOutOfBoundsException
else:
exception_class = WebDriverException
if value == '' or value is None:
value = response['value']
if isinstance(value, basestring):
if exception_class == ErrorInResponseException:
raise exception_class(response, value)
raise exception_class(value)
if message == "" and 'message' in value:
message = value['message']
screen = None
if 'screen' in value:
screen = value['screen']
stacktrace = None
if 'stackTrace' in value and value['stackTrace']:
stacktrace = []
try:
for frame in value['stackTrace']:
line = self._value_or_default(frame, 'lineNumber', '')
file = self._value_or_default(frame, 'fileName', '<anonymous>')
if line:
file = "%s:%s" % (file, line)
meth = self._value_or_default(frame, 'methodName', '<anonymous>')
if 'className' in frame:
meth = "%s.%s" % (frame['className'], meth)
msg = " at %s (%s)"
msg = msg % (meth, file)
stacktrace.append(msg)
except TypeError:
pass
if exception_class == ErrorInResponseException:
raise exception_class(response, message)
elif exception_class == UnexpectedAlertPresentException and 'alert' in value:
raise exception_class(message, screen, stacktrace, value['alert'].get('text'))
> raise exception_class(message, screen, stacktrace)
E WebDriverException: Message: sendKeysToActiveElement
E Build info: version: '3.6.0', revision: '6fbf3ec767', time: '2017-09-27T16:15:40.131Z'
E System info: host: 'DESKTOP-NTB4PU8', ip: '172.16.190.211', os.name: 'Windows 10', os.arch: 'x86', os.version: '10.0', java.version: '1.8.0_151'
E Driver info: driver.version: unknown
E Stacktrace:
E at org.openqa.selenium.remote.http.AbstractHttpCommandCodec.encode (AbstractHttpCommandCodec.java:220)
E at org.openqa.selenium.remote.http.AbstractHttpCommandCodec.encode (AbstractHttpCommandCodec.java:118)
E at org.openqa.selenium.remote.server.ProtocolConverter.handle (ProtocolConverter.java:84)
E at org.openqa.selenium.remote.server.ServicedSession.execute (ServicedSession.java:97)
E at org.openqa.selenium.remote.server.WebDriverServlet.lambda$handle$0 (WebDriverServlet.java:232)
E at java.util.concurrent.Executors$RunnableAdapter.call (None:-1)
E at java.util.concurrent.FutureTask.run (None:-1)
E at java.util.concurrent.ThreadPoolExecutor.runWorker (None:-1)
E at java.util.concurrent.ThreadPoolExecutor$Worker.run (None:-1)
E at java.lang.Thread.run (None:-1)
C:\Python27\lib\site-packages\selenium-3.3.1-py2.7.egg\selenium\webdriver\remote\errorhandler.py:193: WebDriverException
我非常难过为什么Firefox不喜欢我尝试使用任何Action Chain命令。任何建议或见解将不胜感激。
答案 0 :(得分:1)
如果您的geckodriver版本为<v0.14
,请将其升级为>=v0.15
。这是早期版本的geckodriver中的一个已知问题,它不支持Actions类。
看到:
SO answer