Comments (1)
原因(应该是这样)
page.execute_script("arguments[0].click()", page.xxbtn)
Element类是描述符类,走的是__get__
方法,返回self
(应该是当前实例),并不是elem
(元素),所以报错了
看page_objects.py 130行
class Element(object):
"""
Returns an element object
"""
def __init__(self, timeout=5, describe="undefined", index=0, **kwargs):
self.timeout = timeout
self.index = index
self.desc = describe
if not kwargs:
raise ValueError("Please specify a locator")
if len(kwargs) > 1:
raise ValueError("Please specify only one locator")
self.kwargs = kwargs
self.k, self.v = next(iter(kwargs.items()))
if self.k not in LOCATOR_LIST.keys():
raise FindElementTypesError("Element positioning of type '{}' is not supported.".format(self.k))
def __get__(self, instance, owner):
if instance is None:
return None
Browser.driver = instance.driver
return self
def __set__(self, instance, value):
self.__get__(instance, instance.__class__)
self.send_keys(value)
...
def __get_element(self, by, value):
"""
Judge element positioning way, and returns the element.
"""
# selenium
if by == "id_":
self.__find_element((By.ID, value))
elem = Browser.driver.find_elements_by_id(value)[self.index]
elif by == "name":
self.__find_element((By.NAME, value))
elem = Browser.driver.find_elements_by_name(value)[self.index]
elif by == "class_name":
self.__find_element((By.CLASS_NAME, value))
elem = Browser.driver.find_elements_by_class_name(value)[self.index]
elif by == "tag":
self.__find_element((By.TAG_NAME, value))
elem = Browser.driver.find_elements_by_tag_name(value)[self.index]
elif by == "link_text":
self.__find_element((By.LINK_TEXT, value))
elem = Browser.driver.find_elements_by_link_text(value)[self.index]
elif by == "partial_link_text":
self.__find_element((By.PARTIAL_LINK_TEXT, value))
elem = Browser.driver.find_elements_by_partial_link_text(value)[self.index]
elif by == "xpath":
self.__find_element((By.XPATH, value))
elem = Browser.driver.find_elements_by_xpath(value)[self.index]
elif by == "css":
self.__find_element((By.CSS_SELECTOR, value))
elem = Browser.driver.find_elements_by_css_selector(value)[self.index]
# appium
elif by == "ios_uiautomation":
self.__find_element((MobileBy.IOS_UIAUTOMATION, value))
elem = Browser.driver.find_elements_by_ios_uiautomation(value)[self.index]
elif by == "ios_predicate":
self.__find_element((MobileBy.IOS_PREDICATE, value))
elem = Browser.driver.find_elements_by_ios_predicate(value)[self.index]
elif by == "ios_class_chain":
self.__find_element((MobileBy.IOS_CLASS_CHAIN, value))
elem = Browser.driver.find_elements_by_ios_class_chain(value)[self.index]
elif by == "android_uiautomator":
self.__find_element((MobileBy.ANDROID_UIAUTOMATOR, value))
elem = Browser.driver.find_elements_by_android_uiautomator(value)[self.index]
elif by == "android_viewtag":
self.__find_element((MobileBy.ANDROID_VIEWTAG, value))
elem = Browser.driver.find_elements_by_android_viewtag(value)[self.index]
elif by == "android_data_matcher":
self.__find_element((MobileBy.ANDROID_DATA_MATCHER, value))
elem = Browser.driver.find_elements_by_android_data_matcher(value)[self.index]
elif by == "accessibility_id":
self.__find_element((MobileBy.ACCESSIBILITY_ID, value))
elem = Browser.driver.find_elements_by_accessibility_id(value)[self.index]
elif by == "android_view_matcher":
self.__find_element((MobileBy.ANDROID_VIEW_MATCHER, value))
elem = Browser.driver.find_elements_by_android_view_matcher(value)[self.index]
elif by == "windows_uiautomation":
self.__find_element((MobileBy.WINDOWS_UI_AUTOMATION, value))
elem = Browser.driver.find_elements_by_windows_uiautomation(value)[self.index]
elif by == "image":
self.__find_element((MobileBy.IMAGE, value))
elem = Browser.driver.find_elements_by_image(value)[self.index]
elif by == "custom":
self.__find_element((MobileBy.CUSTOM, value))
elem = Browser.driver.find_elements_by_custom(value)[self.index]
else:
raise FindElementTypesError(
"Please enter the correct targeting elements")
if Browser.show is True:
try:
style_red = 'arguments[0].style.border="2px solid #FF0000"'
style_blue = 'arguments[0].style.border="2px solid #00FF00"'
style_null = 'arguments[0].style.border=""'
for _ in range(2):
Browser.driver.execute_script(style_red, elem)
sleep(0.1)
Browser.driver.execute_script(style_blue, elem)
sleep(0.1)
Browser.driver.execute_script(style_blue, elem)
sleep(0.5)
Browser.driver.execute_script(style_null, elem)
except WebDriverException:
pass
return elem
...
其实__elements()
返回的才是page.execute_script("arguments[0].click()", elems)
应该接受的参数
但虫师大佬把这个方法私有化了,不能在外部调用了(如果有误我道歉)
我的处理方法是
"""
InheritElement.py
"""
from poium.config import Browser
from poium.common import logging
from poium import Element
class InheritElement(Element):
def click_js(self):
Browser.driver.execute_script("arguments[0].click();", self._Element__get_element(self.k, self.v))
logging.info("🖱 click element by click_js: {}".format(self.desc))
我的处理方法是再封装一层类,强制调用私有方法(但这种做法不是很符合规范)
from poium.
Related Issues (20)
- log 输出乱码[32mINFO ✅ Find element: id=kw [0m 怎么去掉? HOT 2
- poium 能和 behave 一起使用吗
- 【功能】CSSElement 提供获取输入框内容的方法 HOT 1
- 【功能】实现移动端口keyevent 操作 HOT 1
- 【升级】支持selenium 4.0 版本 HOT 1
- Element.get_attribute(name)不可用 HOT 2
- Element.value_of_css_property的返回值应是property_value而非property_name HOT 3
- [提问]如何使用Elements class来获取元素的个数
- 单个元素的定位,返回类型是poium Element,导致调selenium的drag_and_drop 报错move_to requires a WebElement HOT 1
- Elements定位元素时,执行时,没有输出log.info HOT 1
- 用golang重写poium难吗 HOT 1
- 页面跳转后元素定位怎么处理? HOT 4
- 有方法可以判断element不存在吗? Element()初始化会报index out of range HOT 3
- 能否把__get_element()方法public出来,以便扩展和调用。
- open()报错 HOT 3
- 能否与DrissionPage 工具兼容?https://pypi.org/project/DrissionPage/ HOT 4
- Element.select_all 方法缺少grid的判断
- 返回的类型为什么会没统一
- 运行代码报错ModuleNotFoundError: No module named 'appium.webdriver.common.touch_action';版本不兼容 HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from poium.