【问题标题】:TypeError: find_element() takes from 1 to 3 positional arguments but 5 were givenTypeError: find_element() 接受 1 到 3 个位置参数,但给出了 5 个
【发布时间】:2020-10-28 10:11:33
【问题描述】:

尝试打开登录页面并登录,此时以server_id=... 结尾的链接将可用,这是一个用于编辑我的服务器列表的面板,然后我想单击底部的更新按钮。我是否正确使用了By

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

driver = webdriver.Chrome(executable_path='C:/bin/chromedriver.exe')

driver.get('https://minecraft-server-list.com/login/login.php')

WebDriverWait(driver, 3).until(
    expected_conditions.text_to_be_present_in_element(
        By.NAME, 'username') or
    expected_conditions.text_to_be_present_in_element(
        By.CLASS_NAME, 'column-heading'))

if expected_conditions.text_to_be_present_in_element(
        By.NAME, 'username'):

    user = driver.find_element_by_name('username')
    pw = driver.find_element_by_name('password')

    user.clear()
    user.send_keys('redacted')
    pw.clear()
    pw.send_keys('redacted')

    driver.find_element_by_name('Submit').click()

    WebDriverWait(driver, 3).until(
        expected_conditions.text_to_be_present_in_element(
            By.CLASS_NAME, 'column-heading'))

    driver.get('https://minecraft-server-list.com/login/edit_server.php?server_id=redacted')

    WebDriverWait(driver, 3).until(
        expected_conditions.text_to_be_present_in_element(
            By.CLASS_NAME, 'serverdatadiv1'))

    driver.find_element_by_name('button').click()

    driver.quit()

elif expected_conditions.text_to_be_present_in_element(
        By.CLASS_NAME, 'column-heading'):
    driver.get('https://minecraft-server-list.com/login/edit_server.php?server_id=redacted')

    WebDriverWait(driver, 3).until(
        expected_conditions.text_to_be_present_in_element(
            By.CLASS_NAME, 'serverdatadiv1'))

    driver.find_element_by_name('button').click()

    driver.quit()

driver.quit()

完全错误:

Traceback (most recent call last):
  File "C:/Users/veggie/Desktop/devshit/projects/mcslUpdater/main.py", line 14, in <module>
    By.CLASS_NAME, 'column-heading'))
  File "C:\Users\veggie\Anaconda3\lib\site-packages\selenium\webdriver\support\wait.py", line 71, in until
    value = method(self._driver)
  File "C:\Users\veggie\Anaconda3\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 209, in __call__
    element_text = _find_element(driver, self.locator).text
  File "C:\Users\veggie\Anaconda3\lib\site-packages\selenium\webdriver\support\expected_conditions.py", line 411, in _find_element
    return driver.find_element(*by)
TypeError: find_element() takes from 1 to 3 positional arguments but 5 were given

【问题讨论】:

    标签: python-3.x selenium selenium-webdriver webdriverwait expected-condition


    【解决方案1】:

    WebDriverWait 中似乎有错字。

    根据定义,element_to_be_clickable() 应该在 tuple 中调用,因为它不是一个函数,而是一个,其中初始化程序只期望 1隐式self参数:

    class element_to_be_clickable(object):
        """ An Expectation for checking an element is visible and enabled such that you can click it."""
        def __init__(self, locator):
            self.locator = locator
    
        def __call__(self, driver):
            element = visibility_of_element_located(self.locator)(driver)
            if element and element.is_enabled():
                return element
            else:
                return False
    

    所以,有效地代替:

    elif expected_conditions.text_to_be_present_in_element(
        By.CLASS_NAME, 'column-heading'):
        
    

    你需要:

    elif WebDriverWait(driver, 3).until((expected_conditions.text_to_be_present_in_element(
        By.CLASS_NAME, 'column-heading'))):
    

    同样,您必须更改WebDriverWait 的其他实例。


    参考

    您可以在以下位置找到详细讨论:

    【讨论】:

      猜你喜欢
      • 2018-06-21
      • 2020-07-14
      • 2015-07-13
      • 2015-09-01
      • 2019-06-28
      • 1970-01-01
      • 2023-03-03
      • 2020-06-13
      • 2021-02-02
      相关资源
      最近更新 更多