当前位置: 首页 > 知识库问答 >
问题:

page.py文件和element.py文件如何在Selenium PageObject教程上交互?什么是BasePageElement?

葛俊
2023-03-14

基于用户在搜索引擎上的输入,我试图通过多个层次从网站上的搜索结果中提取数据。用户的搜索结果可能会有所不同,所以我决定使用PageObject设计模式来扩展我的项目,但我不理解Python Selenium教程以及元素是如何定义的。py文件和页面。py文件交互,以便我可以根据自己的喜好编辑它们。

我将遵循以下教程:https://selenium-python.readthedocs.io/page-objects.html

BasePageElement是什么?这个文件只适用于网页垃圾的第一层吗?我是否应该复制BasePageElement类并将其编辑到网站的下一层?有没有更好的解释元素是什么。py文件实际上在做什么?

共有1个答案

崔高远
2023-03-14

页面Stackoveflow示例

但目前的课程对我来说有两个问题:

>

BasePageElement在单个元素上搜索,因此在搜索页面上获取所有结果是无用的。

它将需要其他类使其更有用。

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException, TimeoutException

# --- original classes ---

class BasePage(object):
    """Base class to initialize the base page that will be called from all pages"""

    def __init__(self, driver):
        self.driver = driver

class BasePageElement(object):
    """Base page class that is initialized on every page object class."""

    def __set__(self, obj, value):
        """Sets the text to the value supplied"""
        driver = obj.driver

        WebDriverWait(driver, 100).until(
            lambda driver: driver.find_element_by_name(self.locator))
        driver.find_element_by_name(self.locator).clear()
        driver.find_element_by_name(self.locator).send_keys(value)
        #driver.find_element_by_name(self.locator).send_keys(Keys.Return)

    def __get__(self, obj, owner):
        """Gets the text of the specified object"""
        driver = obj.driver
        WebDriverWait(driver, 100).until(
            lambda driver: driver.find_element_by_name(self.locator))
        element = driver.find_element_by_name(self.locator)
        return element.get_attribute("value")

# --- my classes ---

class SearchTextElement(BasePageElement):

    locator = 'q'

class MainPage(BasePage):

    # element has to be defined here 
    # (not as `self.field` because it will not work as expected)
    search_text_element = SearchTextElement()

    def search(self, query):
        self.search_text_element = [query, Keys.RETURN]

# ---- 

class ResultElement(BasePageElement):

    locator = 'q' # there is no other `name` on Stackoveflow

class ResultPage(BasePage):

    # element has to be defined here 
    # (not as `self.field` because it will not work as expected)
    result_element = ResultElement()

    def get_result(self):
        return self.result_element

# --- main ---

#driver = webdriver.Firefox()
driver = webdriver.Chrome()
driver.get('https://stackoverflow.com')

main_page = MainPage(driver)
main_page.search('selenium')

result_page = ResultPage(driver)
result = result_page.get_result()
print('result:', result)
 类似资料:
  • 本文向大家介绍什么是PHP文件?如何打开PHP文件?,包括了什么是PHP文件?如何打开PHP文件?的使用技巧和注意事项,需要的朋友参考一下 在平时我们可能会碰到过php文件,可是很多用户不知道php文件是什么文件?也不知道怎么打开php文件?为了满足一些用户的好奇心,小编现在就给大家讲解php文件以及如何打开php文件的方法。 1、PHP文件是什么?   PHP(Hypertext Preproc

  • 我试图用Reactjs做一个网站模板。在大屏幕部分,我做订阅表单,在主页部分用户输入表单。但是一个组件的css与另一个组件的css相互作用。我怎么处理?[1]:https://i.stack.imgur.com/Wd4OQ.png 用户EntryJs:- 导入“./User Entry.css” 类窗体扩展组件{initialState={name:,age:,job:}state=this.in

  • 之前各个章节版本库间的交互都是通过git push和/或git pull命令实现的,这是Git最主要的交互模式,但并不是全部。使用补丁文件是另外一种交互方式,适用于参与者众多的大型项目进行分布式开发。例如Git项目本身的代码提交就主要由贡献者通过邮件传递补丁文件实现的。作者在写书过程中发现了Git的两个bug,就是以补丁形式通过邮件贡献给Git项目的,下面两个链接就是相关邮件的存档。 关于Git文

  • 问题内容: 什么是JAXB..episode文件?它是由JAXB生成的,还是为了避免JAXB再生相同类而配置的配置文件? 问题答案: 注意: 我是 EclipseLink JAXB(MOXy)的 负责人,并且是 JAXB 2(JSR-222) 专家组的成员。 .episode文件由XJC(XML Schema to Java)编译器生成。它是将架构类型与现有类相关联的架构绑定。当您拥有一个由其他模

  • 在开发软件的过程中,我们需要将编写好的代码(Code)保存到一个文件中,这样代码才不会丢失,才能够被编译器找到,才能最终变成可执行文件。这种用来保存代码的文件就叫做 源文件(Source File)。 我们将在《 编译和链接》一节中讲解编译器的概念。 每种编程语言的源文件都有特定的后缀,以方便被编译器识别,被程序员理解。源文件后缀大都根据编程语言本身的名字来命名,例如: C语言源文件的后缀是; C

  • 问题内容: 因此,我在处理大量文件类型方面经验不足,并且我还无法找到有关什么文件的大量信息。这是我想做的事情: 我正在尝试下载以可单独下载的图块形式排列的地图数据集:http://daymet.ornl.gov/gridded 为了立即下载一系列图块,他们说要下载其脚本,该脚本最终导致:https : //github.com/daymet/scripts/blob/master/Bash/day