目前我正在尝试使用Selenium和Proboscis编写自动化测试套件.我试图抽象webdriver并通过工厂模式实现.Page_object这里也创建了class,它在创建对象时将webdriver作为参数.下面是代码.
import selenium.webdriver as webdriver
from proboscis import TestProgram
from proboscis import test
from proboscis import before_class
from proboscis import after_class
class WebdriverFactory:
@staticmethod
def getWebdriver(browserName):
if(browserName == 'firefox'):
return webdriver.Firefox()
elif(browserName == 'chrome'):
return webdriver.Chrome()
elif(browserName == 'ie'):
return webdriver.Ie()
raise Exception("No such " + browserName + " browser exists")
class Page_Object:
def __init__(self, driver):
self.driver = driver
def go_to_home(self):
self.driver.get("http://google.com")
return self
def go_to_page(self,url):
self.driver.get(url)
return self
def run_search(self, url, query):
self.driver.get(url)
self.driver.find_element_by_id(locators['search_box']).send_keys(query)
self.driver.find_element_by_id(locators['search_button']).click()
def tear_down(self): …Run Code Online (Sandbox Code Playgroud) 我想写这个函数find:
multi_set<int, string, double, myType> m; //vector of tuples
m.insert(/*some data*/);
m.find<1,2>("something",2.123);
Run Code Online (Sandbox Code Playgroud)
要么
m.find<0,3>(1,instanceOfMyType);
m.find<1>("somethingelse");
Run Code Online (Sandbox Code Playgroud)
哪里find可以参数化对应于元组参数的任何子集.
我的代码到目前为止:
template <typename ... T>
class multi_set{
typedef tuple < T... > Tuple;
vector<tuple<T...>> data = vector<tuple<T...>>();
public:
void insert(T... t){
data.push_back(tuple<T...>(t...));
}
template<size_t ... Pos>
void find(???){
// then I would like to use those params to search through data and
// return first matching item
}
}
Run Code Online (Sandbox Code Playgroud) C++ 中的本地静态对象在第一次需要时初始化一次(如果初始化有副作用,这是相关的):
void once() {
static bool b = [] {
std::cout << "hello" << std::endl; return true;
} ();
}
Run Code Online (Sandbox Code Playgroud)
once 将在第一次调用时打印“hello”,但如果再次调用则不会打印。
我已经将这种模式的一些变体放入Compiler Explorer并注意到所有知名实现(GCC、Clang、ICC、VS)本质上都在做同样的事情:guard variable for once()::b创建一个隐藏变量,并检查是否“这次”需要初始化主变量;如果是,它会被初始化,然后设置守卫,下次它不会跳出初始化代码。例如(通过将 lambda 替换为对 的调用来最小化extern bool init_b();):
once():
movzx eax, BYTE PTR guard variable for once()::b[rip]
test al, al
je .L16
ret
.L16:
push rbx
mov edi, OFFSET FLAT:guard variable for once()::b
call __cxa_guard_acquire
test eax, eax
jne .L17
pop rbx
ret
.L17:
call init_b()
pop rbx
mov …Run Code Online (Sandbox Code Playgroud) 我有一个复合索引类型,它由两个16位整数组成一个32位对象,设计用于传递并稍微像指针一样对待.但我偶然注意到我定义的比较运算符没有按照我预期的方式进行优化.
鉴于此缩减代码:
#include <cstdint>
struct TwoParter {
std::uint16_t blk;
std::uint16_t ofs;
};
static_assert (sizeof(TwoParter) == sizeof(std::uint32_t), "pack densely");
bool equal1 (TwoParter const & lhs, TwoParter const & rhs) {
return lhs.blk == rhs.blk && lhs.ofs == rhs.ofs;
}
bool equal2 (TwoParter const & lhs, TwoParter const & rhs) {
auto lp = reinterpret_cast <std::uint32_t const *> (&lhs);
auto rp = reinterpret_cast <std::uint32_t const *> (&rhs);
return *lp == *rp;
}
Run Code Online (Sandbox Code Playgroud)
GCC(编译器资源管理器上的7.1 )生成以下程序集(选项-m64 -std=c++11 -O3):
equal1(TwoParter const&, …Run Code Online (Sandbox Code Playgroud) 我最近在以前使用Linux时转而使用Mac.我发现了MacVim(来自http://code.google.com/p/macvim/)并且一直试图移植我以前的键映射.
我以前的映射如下:
现在,为了使这些映射更像"Mac like",我决定切换前两个使用选项(即Apple徽标)键,所有其他人使用命令键而不是Alt(即Ctrl-Alt-E成为Ctrl-Command-E).我在http://macvim.org/OSX/index.php上读到这个密钥可以用D(即)映射.我的.vimrc的新内容如下:
nmap <D-t> :tabnew<cr>
nmap <D-w> :close<cr>
nmap <D-1> 1gt
nmap <D-2> 2gt
nmap <D-3> 3gt
nmap <D-4> 4gt
nmap <D-5> 5gt
nmap <D-6> 6gt
nmap <D-7> 7gt
nmap <D-8> 8gt
nmap <D-9> 9gt
nmap <D-0> 10gt
nmap <D-Up> :tabnew<CR>
nmap <D-Right> :tabnext<CR>
nmap <D-Left> :tabprevious<CR> …Run Code Online (Sandbox Code Playgroud) (我认为这个问题很可能已经重复或者已经在这里回答了,但是由于"堆栈分配"和相关术语的干扰,寻找答案很难.)
我有一个玩具编译器,我一直在研究脚本语言.为了能够在脚本正在进行时暂停执行并返回到主机程序,它有自己的堆栈:带有"堆栈指针"变量的简单内存块,使用正常的C代码操作递增对于那种事情等等.到目前为止没有意思.
目前我编译为C.但我也有兴趣调查编译机器代码 - 同时保持二级堆栈和在预定义控制点返回主机程序的能力.
所以...我认为在我自己的代码中使用传统的堆栈寄存器不太可能是一个问题,我假设寄存器会发生什么,只要一切都在我完成时就恢复了(如果我做的话,请纠正我)在这一点上我错了.但是 ......如果我希望脚本代码调用其他库代码,使用这个"虚拟堆栈"离开程序是否安全,或者为此目的将它返回原始堆栈是否必不可少?
像这一个和这个的答案表明堆栈不是传统的内存块,但它依赖于特殊的,系统特定的行为来处理页面错误和诸如此类的东西.
所以:
这显然不是必需的,因为简单地将指针返回到实际堆栈将是完全可用的,或者就此而言,首先不要滥用它们并且只是放置更少的寄存器,我可能不应该尝试这样做在所有(尤其是由于明显超出我的深度).但无论如何我仍然很好奇.想知道这些事情是如何运作的.
编辑:对不起,当然应该说.我正在研究x86(我自己的机器为32位),Windows和Ubuntu.没有异国情调.
什么是callx86机器代码中绝对指针的"正确"方法?有没有一种方法可以在一条指令中完成它?
我想做什么:
我正在尝试基于"子程序线程"构建一种简化的迷你JIT(仍然).它基本上是字节码解释器中最短的步骤:每个操作码都是作为一个单独的函数实现的,因此每个基本的字节码块都可以"JIT"到它自己的新程序中,如下所示:
{prologue}
call {opcode procedure 1}
call {opcode procedure 2}
call {opcode procedure 3}
...etc
{epilogue}
Run Code Online (Sandbox Code Playgroud)
因此,我们的想法是每个块的实际机器代码只能从模板中粘贴(根据需要扩展中间部分),并且需要"动态"处理的唯一位是将每个操作码的函数指针复制到正确的位置作为每个调用指令的一部分.
我遇到的问题是了解call ...模板部分的用途.x86似乎没有考虑到这种用法,并且有利于相对和间接调用.
它看起来像我可以使用FF 15 EFBEADDE或2E FF 15 EFBEADDE在假设调用函数DEADBEEF(通过把东西变成一个汇编和反汇编,看到什么产生有效的结果,基本上发现了这些未通过了解他们在做什么),但我不理解的东东细分,特权和相关信息足以看出差异,或者这些信息与更常见的call指令有何不同.英特尔架构手册还建议这些仅在32位模式下有效,在64位模式下"无效".
有人可以解释这些操作码以及我是如何或者是否会为此目的使用它们或其他人?
(通过寄存器使用间接调用也有明显的答案,但这似乎是"错误的"方法 - 假设实际存在直接调用指令.)
我正在阅读一些源代码.不仅这个源代码,还有许多其他源代码,使用这种编程:
#define DO_BINOP(FN_NAME,TFLAG,OPER) \
void FN_NAME (bigint_stack &stack) { \
bigint right = stack.front(); \
stack.pop_front(); \
TRACE (TFLAG, "right = " << right); \
bigint left = stack.front(); \
stack.pop_front(); \
TRACE (TFLAG, "left = " << left); \
bigint result = left OPER (right); \
TRACE (TFLAG, "result = " << result); \
stack.push_front (result); \
}
DO_BINOP(do_add, '+', + )
Run Code Online (Sandbox Code Playgroud)
它们用于define定义充当函数的长字符串.我不知道这样做的好处是什么,因为这种方式使程序更难阅读,更难调试.我是C的新手,所以我认为这种方式必须有一些好处,对吧?
谢谢.
假设我有这样的数据类型:
data Color = Red | Blue | Green
Run Code Online (Sandbox Code Playgroud)
如何使用templatehaskell生成这样的函数?
myShow Red = ...
myShow Blue = ...
myShow Green = ...
Run Code Online (Sandbox Code Playgroud)
即我正在寻找基于模式匹配的函数的多个定义.
runST是一个Haskell函数,它通过类型静态地约束资源的可用生命周期.为此,它使用rank-2多态性.标准ML的简单类型系统仅提供秩-1多态性.
标准ML是否仍然可以使用类型将资源的生命周期约束到类似的最终结果?
此页面和此页面演示了一些重构代码的方法,只需要更简单的类型.如果我理解正确,核心是将表达式包装起来,以便它被上下文中可能的观察所取代,这些观察是有限的.这种技术一般吗?可以将它,或相关编码,具有一些可使用像(显然在签名不相同)runST,以防止从被包裹的表达逸出值的类型被观察?如果是这样,怎么样?
我想象的场景是这样的:
magicRunSTLikeThing (fn resource =>
(* do things with resource *)
(* return a value that most definitely doesn't contain resource *)
)
Run Code Online (Sandbox Code Playgroud)
...其中magic...提供了用户提供的代码无法以任何方式共享的资源.显然,这样一个简单的界面具有单个库函数是不可能的,但也许有各种层次的包装和手工内联和提取......?
我已经看到了这一点,但如果我理解正确(...很可能不是),那实际上并不会阻止对资源的所有引用进行共享,只能确保对它的一个引用必须"关闭".
基本上我想在SML中实现安全类型的显式(非推断的MLKit样式)区域.